ML }  X c0C)HCCH Mhhݩh `eCDiCD`  RyHP   * 1H0芢@) Y0.Ș` i #(PMR\ \b Pgi 0  % @ / ՠ`d   0DDԝLyN@  )?HI Y0`HIJH) * J j * hJJJ )HJ h i     } YS S0 i`΢ϣ߳H J3xj2h} 1 |9 ӭ45(420 * (0241өX.`  R *i)Lvw  ~*P}E 5 LN(G E  r s k rsrL ( E LO(0d( L iE0O +)$IC  H S8 }q p h   j 8no CDLQ CFl M  LO Ri)Llk2'")*F }$F$F$F$F$ 5 )ШF/Șl]kpqС,LQ/A! Ti)Zlk@ ܬ/i)(")")k }$F$F$F 5$/L /lF@jj(LNkle$$%8(k()` R 8 ELO Ri)^>jf | NrC s } ) vw5g   enfo Glvw LQ@iLm>j FL ~Jjjjii p qEh }jlrs`LQ:$ȱ$@+[_#{ 8  Խut! ai 8   E I   ] C } H h    ˰ 8  N   Lm E  ,  [ `LQ ,/ 8 ~/  Ơ? ѩ}/  [ /Lj0?MoLn FjMqLp NklLOLQnLoMlNLO R"(+}ըHH`Q R!!  % !   / .   FȑF! /GF \H"+0+* }! F tLQnm: J~nTF1F  *n+)5! n (, n)1JJJn(n*o} I ,0  ci a oF? @ , 8,0 ʩ0H Eh   i}  D ]DmmFLQvtu`*&!*@h ] 0 ^0` c 0l$$%}()()%*&J%H,@hH hH@,h $% 8i8$(%)0hhH ]h`() c 0H c 0 h}`hhh&JJ ](ll  LQ0  /qnoHH 9 9 H H  I9  9 } Nd EH  Q8 o n  FnoL HII/ Ih8`h`Lnon`no`u F }E VEhLO/luF l0BF/lɜɛ׽hE N  b VFL FREE SECTORS C} H) *Fh ):FȽ F FC IH' 0 d  i:Fȩ/F.l`CD/08HDIC}IHȰ/F`ȱ$>.+.i ȱ$:刄H !A \ Hȱ$*?ȝ 2. ? [_{ ,0}-:) 0$:>WI  IТ,LQH  0hLd ~ t u`C ?( 0(C.` E } R =! .ti S0N EE D XC )0')AY  )ע ? 0E088FG \o}n  (HhLcL3 iJ i Lqp 0=rspnqopqlk`jZj0  j FL`H}FhȑFȽlFi0 h FFLFpvqwgneofLF pq7  G0i 0 FJJh1FqȱFpȱFk`B!}08`hEE D 8. =D}tui( TʩL`b!)    cȌaȌd b`aab}H8 hdaHcd8 cH hHH  \h hc` =Hh I8ih( t  ( t(!` L\}CJfCJfCJfCDfC` a  HII  INdh  `h  `n)8jHniPoijIjFIjFIjh` a } I 38  8H0 I  ' H LQ8j Y  8j NdY  &I &I &IHeH.p!}Iiq  `!.莿 2Jjj }.m Ȉ!m FG` ɩLQ z "} e Hi04 \ Ȍ  8 i h !`I0 `C Y8.`DOS SYS#} I  ` ~ݩ.C/`ba.m۩mѤC9 `C L] H  ,- '0 l $}, BLVDE`D1:AUTORUN.SYS8hhJ ȱHȱIȱBȱDȱEeeHHLV)  %}1*  ,,p-  0 I &  '0   Lw)l, 0  I&LD1:MEM.SAV&}E:D1:DUP.SYS w.2I`& n= +OOɰR.`p KG$3?Qa!#BF r#G5'} D  C D     )16CS S)  C)D1 p p (}0 C9DI pCDL~CiCDiD` DD˙` d J)L !)}D L(( LL()  L| L( S LH 0p n  *} CY?  q  L L  ` )+} `A! d߰")-݆ "  $G@LLL&0") $G%,}H0 3S8`G ȱG ȱG   Gȭ Gȭ GG}GHiH8(()) G$H% `(0-})8` d)L ݆ & LGȘ ݆LL d  ! LL d)N>Q  HH).}  hyhyB q L> Lm JJ  Ln*` dB%'/}8  H H` 1 { LL   !L     Hh SY?  q  1L0}  !? S   q 1 L   Ll  Lg E`L   !L)  q 1L1}) `L0AM݊L݉ ML  N݆LLLNLMLHG!@2}1F GȱGLLEEȩÑEȑEEȑE Ed E7EȩE  q3} L !,0,0SGɛ L 1 !L EHEh W G gLLSROTCES EERF 4} G) *Gȩ GȽG GȌd q q G`  8   0G  `D5}CEDC0X:Ȣ Y ȱC* ? 0.. , 0%n ?A[ 0 : L`L  `, 0`Y6}`piH n0)բY? 08`0 7}  0$L GGȽG L `8L`L8}8`  05G)݁,G)ȱGȱGHh0})Hh` B! 8`8iiiLE`9}E8FEh( l0`ɃLL L8^~jj8jHi hEEEiEȱEiE` dTE:} H8EEȱEEȩEh J E8   . m  i`LI!)E1FR;}1LJ舩9GIH`LJJ`HGHh l`<} S gL   8 rii `дCDCG W  =}C  Lq` X٨`DOS SYS IIIIIIIIIIIIIIIC`0 ߩ0}}>} HE |||||DOS DOSDOS SYS }?}}@}CDOS SYSA} 0`BDELV !B B}`LVUQ   ]   TU J ]L!T  #      TU C} L ? .  t`GBJ V~DEHI B V0dVD}QDEHI VF9 ,0 ,0 s0hhL  L` H hDHEhE}DEL8HI   0 HI,0 0  9 .G VLOF},0 L4*IJ`llD1:AUTORUN.SYSNEED MEM.SAV TO LOAD THIS FILE.D1:MEM.SAV J y08 B|DEHIG} V0 0`B;DELV䌚 !B y`@ʆ v s? F0Ξ05: [ BDEHIH} VY8 B V  @  /DE `E:D1:DUP.SYSERROR-SAVING USER MEMORY ON DISKTYPE Y TO I}STILL RUN DOS B;DE J V (` 9 V⪍ ઍ  -J}LLu DEHILV 9 .l 9 .l  `` s$B VBHK}I|DE V BLV nB,DE J V* \*` B V BLVDEHI BLVLL}1 3u H232435; 1 ;  hh@2 e1i1LHҍ 00) 08 109hh@ Ҡ2eM}1i1232435ޥ<<8} 1ATO@dBINARY FILE MENU/LOADERnBASIC PROGRAM TO CREATExO}AN AUTORUN.SYS FILELOADING AT $1DFCBY RICHARD J. KALAGHER..@@ D:AUTORUN.SYSP}9@, Ap-AA@+  READING LINE +-@@"68,-6-%Q} "Ap+-@@'*@8,+   ERROR IN LINE --255,255,124,R}29,255,29,32,224,30,32,1265))37,31,32,224,29,32,193,30,48,6,1927**32,85,31,76,133,29,32,187,31,32,2595,,182,30,32S},177,30,32,148,32,32,246,3536**31,32,115,32,32,177,30,32,61,32,4110))32,21,30,32,78,30,32,213,29,32,4639$++147,30,T}32,125,30,32,78,30,32,136,5311.((30,32,98,30,32,165,30,48,9,32,58178,,203,29,76,171,29,108,226,2,32,182,6875B,,30,10U}8,224,2,96,169,212,141,226,2,8085L++169,29,141,227,2,96,162,32,169,3,9115V++157,66,3,169,6,157,74,3,169,250,10169`**V}157,68,3,169,29,157,69,3,32,86,10942j**228,96,68,49,58,42,46,42,18,30,11619t++158,32,155,0,0,162,32,169,3,157,12487~*W}*66,3,169,0,157,68,3,169,30,157,13309))69,3,169,4,157,74,3,32,86,228,14134,,96,162,32,169,7,157,66,3,165,192,15183X}--157,68,3,165,193,157,69,3,165,198,16361++157,72,3,165,199,157,73,3,32,86,1730800228,96,169,19,133,192,169,30,133,Y}193,18670--169,2,133,198,169,0,133,199,32,47,197520030,96,165,196,56,229,194,133,198,165,2121400197,229,195,133,1Z}99,24,165,198,105,1,2266000133,198,165,199,105,0,133,199,96,173,24061..19,30,133,194,173,20,30,133,195,96,25084//[}173,19,30,133,196,173,20,30,133,197,26188,,96,174,19,30,232,240,1,96,174,20,27270++30,232,240,1,96,32,78,30,96,165,28\}270 00194,133,192,165,195,133,193,32,47,30,29584--96,162,48,76,184,30,162,32,169,12,30555,,157,66,3,32,86,228,96,1]}62,32,169,31586())5,157,66,3,169,0,157,68,3,169,323832++30,157,69,3,169,18,157,72,3,169,33230<**0,157,73,3,32,86,228^},96,162,48,34115F))169,3,157,66,3,169,4,157,68,3,34914P**169,31,157,69,3,169,8,157,74,3,35754Z**169,0,157,75,3,32,86_},228,169,1,36674d,,141,240,2,96,69,58,162,48,169,11,37670n--157,66,3,165,194,157,68,3,165,195,38843x--157,69,3,165,1`}98,157,72,3,165,199,40031++157,73,3,32,86,228,96,169,1,133,41009//84,169,10,133,85,169,67,133,194,169,42222//31,1a}33,195,169,16,133,198,169,0,133,43399,,199,32,6,31,230,84,96,66,105,110,44358--97,114,121,32,76,111,97,100,32,77,4521b}5--101,110,117,65,0,32,153,31,32,177,46033//31,169,0,133,194,169,30,133,195,169,47256//10,133,198,169,0,133,199,2c}30,84,160,48572,,6,173,83,31,201,78,144,12,160,24,49484,,165,84,201,16,208,4,169,3,133,84,50551,,132,85,173,83,31d},141,0,30,169,45,51440))141,1,30,32,18,32,32,6,31,238,52001,,83,31,96,173,10,30,201,83,208,16,52932,,173,11,30,20e}1,89,208,9,173,12,30,53868,,201,83,208,2,104,104,96,173,1,30,54870..201,32,240,2,104,104,96,169,20,133,55971"//84,f}169,4,133,85,169,215,133,194,169,57326,//31,133,195,169,31,133,198,169,0,133,585186--199,32,6,31,96,80,114,101,115,115,g}59407@0032,116,104,101,32,76,101,116,116,101,60302J//114,32,111,102,32,89,111,117,114,32,61156T..67,104,111,105,99,1h}01,162,48,169,3,62125^++157,66,3,169,16,157,68,3,169,32,62965h))157,69,3,169,4,157,74,3,32,86,63719r,,228,96,75,58,1i}60,0,174,84,31,177,64802|00194,9,128,157,159,32,232,200,200,177,6629000194,157,159,32,201,32,240,11,232,200,6774800j}192,10,144,241,169,32,157,159,32,142,69026**84,31,238,84,31,96,0,162,0,189,69941//159,32,232,205,60,32,208,247,169,6k}8,71353**141,0,30,169,58,141,1,30,160,0,72083..189,159,32,153,2,30,232,200,201,32,73313//208,244,136,169,46,153,2l},30,200,169,74670++42,153,2,30,200,169,32,153,2,30,75483**96,162,48,169,7,157,66,3,169,0,76360++157,72,3,157,73,3m},32,86,228,201,77372..65,144,234,205,83,31,176,229,9,128,78676..141,60,32,96,169,212,141,224,2,169,79922++29,141,n}225,2,96,226,2,227,2,124,80996 29,0,0,0,0,0,0,0,0,0,81025 D2:BFMENU.BAS,169,212,141,224,2,169,79922++29,141,T0100 ; BINARY LOAD MENU PROGRAM0110 ; NAME OBJECT FILE D:AUTORUN.SYS0120 ;0130 ; RICHARD J. KALAGHER0140 ; AUGUST 7, 1983p}0150 ;0160 .OPT NOEJECT0170 ;0180 ; EQUATES0190 ;0200 SL=$C0 ;PAGE ZERO TEMPORARY0210 SH=$C1 ;LOCATIONS. LAST0220 STq}L=$C2 ;LETTER "L" FOR LOW0230 STH=$C3 ;"H" FOR HIGH.0240 ENL=$C40250 ENH=$C50260 BLL=$C60270 BLH=$C70280 CIO=$E4560290r} ICCMD=$0342 ;COMMAND0300 ICBAL=$0344 ;BUFFER ADDRESS LOW0310 ICBAH=$0345 ;BUFFER ADDRESS HIGH0320 ICAX1=$034A ;AUX 10330s} ICAX2=$034B ;AUX 20340 ICBLL=$0348 ;BUFFER LENGTH LOW0350 ICBLH=$0349 ;BUFFER LENGTH HIGH0360 ROWCRS=84 ;ROW FOR NEXT SCRt}EEN WRITE0370 COLCRS=85 ;COLUMN FOR NEXT SCREEN WRITE0380 CRSINH=$02F0 ;CURSOR INHIBIT0390 ;0400 *=$1D7C ;***SEE TEXT***u}0410 ;0420 MENU JSR OPENSC ;OPEN THE SCREEN/EDITOR0430 JSR HEADER ;PUT A TITLE ON THE SCREEN0440 JSR OPEDIR ;OPEN THE Dv}IRECTORY FILE0450 GG JSR GETDIR ;GET A DIRECTORY ENTRY0460 BMI FOOT ;IF END OF DIRECTORY THEN JUMP0470 JSR DIRSCN ;PUT Tw}HE DIRECTORY ENTRY ON THE SCREEN0480 JMP GG ;GO BACK AND GET ANOTHER0490 FOOT JSR FOOTER ;ENTRIES ON SCREEN, WRITE A MESSAx}GE0500 JSR CLOSE2 ;CLOSE DIRECTORY FILE0510 JSR CLOSE3 ;CLOSE THE SCREEN0520 JSR SETUP ;SET RUN AND INIT TO RTS0530 Jy}SR OPENK ;OPEN THE KEYBOARD0540 JSR GETLET ;GET A SINGLE LETTER0550 JSR CLOSE3 ;CLOSE THE KEYBOARD0560 JSR FINDNA ;FINDz} THE FILE NAME FOR THAT LETTER0570 JSR OPEFIL ;OPEN THE FILE0580 GETFIL JSR READ2 ;GET TWO BYTES0590 JSR INIT ;SET INIT {}DEFAULT0600 JSR CHKFF ;CHECK IF HEADER0610 JSR STRAD ;PUT START ADDRESS IN0620 JSR READ2 ;GET TWO MORE BYTES0630 JSR |}ENDAD ;PUT END ADDRESS IN0640 JSR BUFLEN ;CALCULATE BUFFER LENGTH0650 JSR GETDAT ;GET THE DATA RECORD0660 BMI JSTART ;S}}TART PROGRAM IF EOF0670 JSR JINIT ;ATTEMPT INITIALAZATION0680 JMP GETFIL ;DO NEXT SEGMENT0690 JINIT JMP ($02E2) ;DO INIT~}IALIZATION0700 JSTART JSR CLOSE2 ;CLOSE THE FILE0710 JMP ($02E0) ;START THE PROGRAM0720 R RTS ;FOR INIT CODE0730 ;0740 }; START OF SUBROUTINES0750 ;0760 ; SET INITIALIZATION TO DEFAULT0770 ;0780 INIT LDA #R&$FF0790 STA $02E20800 LDA #R/2}560810 STA $02E30820 RTS0830 ;0840 ; OPEN THE DIRECTORY FILE0850 ;0860 OPEDIR LDX #$20 ;IOCB#20870 LDA #3 ;OPEN COM}MAND0880 STA ICCMD,X0890 LDA #6 ;DIRECTORY0900 STA ICAX1,X0910 LDA #B1&$FF0920 STA ICBAL,X0930 LDA #B1/2560940 }STA ICBAH,X0950 JSR CIO0960 RTS0970 ;0980 B1 .BYTE "D1:*.*"0990 FNAME *=*+18 ;BUFFER FOR FILE NAME1000 .BYTE $9B ;PR}OBABLY NO NEEDED1010 BAL .BYTE 0 ;TWO BYTE BUFFER FOR1020 BAH .BYTE 0 ;FILE HEADER AND ADDRESS1030 ;1040 ; OPEN FILE FOR }READING1050 ;1060 OPEFIL LDX #$201070 LDA #31080 STA ICCMD,X1090 LDA #FNAME&$FF1100 STA ICBAL,X1110 LDA #FNAME/25}61120 STA ICBAH,X1130 LDA #4 ;OPEN FOR READ1140 STA ICAX1,X1150 JSR CIO1160 RTS1170 ;1180 ; GET A SEGMENT FROM TH}E FILE1190 ;1200 GETREC LDX #$201210 LDA #7 ;GET BYTES1220 STA ICCMD,X1230 LDA SL1240 STA ICBAL,X1250 LDA SH1260} STA ICBAH,X1270 LDA BLL1280 STA ICBLL,X1290 LDA BLH1300 STA ICBLH,X1310 JSR CIO1320 RTS1330 ;1340 ; READ TWO }BYTES INTO BUFFER $C01350 ;1360 READ2 LDA #BAL&$FF1370 STA SL1380 LDA #BAL/2561390 STA SH1400 LDA #21410 STA BLL}1420 LDA #01430 STA BLH1440 JSR GETREC ;GO GET THEM1450 RTS1460 ;1470 ; CALCULATE BUFFER LENGTH1480 ;1490 BUFLEN L}DA ENL1500 SEC1510 SBC STL1520 STA BLL ;LOW BYTE1530 LDA ENH1540 SBC STH1550 STA BLH ;HIGH BYTE1560 CLC ;NOW AD}D ONE1570 LDA BLL1580 ADC #11590 STA BLL1600 LDA BLH1610 ADC #0 ;TAKE CARE OF ANY CARRY1620 STA BLH1630 RTS164}0 ;1650 ; PUT START ADDRESS IN PROPER PL.1660 ;1670 STRAD LDA BAL1680 STA STL1690 LDA BAH1700 STA STH1710 RTS1720} ;1730 ; DO SAME FOR END ADDRESS1740 ;1750 ENDAD LDA BAL1760 STA ENL1770 LDA BAH1780 STA ENH1790 RTS1800 ;1810 ;} CHECK IF HEADER1820 ;1830 CHKFF LDX BAL1840 INX ;MAKE IT 0 IF ITS $FF1850 BEQ TEST2 ;TEST NEXT BYTE1860 RTS ;NOT A H}EADER1870 TEST2 LDX BAH1880 INX1890 BEQ ITSFF ;IT'S $FF1900 RTS1910 ITSFF JSR READ2 ;GET TWO MORE BYTES1920 RTS193}0 ;1940 ; GET DATA BYTES1950 ;1960 GETDAT LDA STL1970 STA SL1980 LDA STH1990 STA SH2000 JSR GETREC2010 RTS2020 };2030 ; CLOSE IOCBS2040 ;2050 CLOSE3 LDX #$302060 JMP CLB2070 CLOSE2 LDX #$202080 CLB LDA #$0C2090 STA ICCMD,X2100 } JSR CIO2110 RTS2120 ;2130 ; GET A DIRECTORY RECORD2140 ;2150 GETDIR LDX #$20 ;IOCB 22160 LDA #5 ; GET BYTES2170 ST}A ICCMD,X2180 LDA #FNAME&$FF2190 STA ICBAL,X2200 LDA #FNAME/2562210 STA ICBAH,X2220 LDA #18 ;LENGTH OF DIRECTORY EN}TRY2230 STA ICBLL,X2240 LDA #02250 STA ICBLH,X2260 JSR CIO2270 RTS2280 ;2290 ; OPEN THE SCREEN2300 ;2310 OPENSC} LDX #$302320 LDA #3 ;OPEN2330 STA ICCMD,X2340 LDA #B4&$FF2350 STA ICBAL,X2360 LDA #B4/2562370 STA ICBAH,X2380 }LDA #8 ;WRITE2390 STA ICAX1,X2400 LDA #0 ;MODE 02410 STA ICAX2,X2420 JSR CIO2430 LDA #1 ;ANY NONZERO2440 STA CRSI}NH ;INHIBIT CURSOR2450 RTS2460 ;2470 B4 .BYTE "E:" ;SCREEN DEVICE2480 ;2490 ; WRITE TO THE SCREEN2500 ;2510 WRITES LD}X #$302520 LDA #$0B ;PUT CHARACTERS2530 STA ICCMD,X2540 LDA STL2550 STA ICBAL,X2560 LDA STH2570 STA ICBAH,X2580 } LDA BLL2590 STA ICBLL,X2600 LDA BLH2610 STA ICBLH,X2620 JSR CIO2630 RTS2640 ;2650 ; PUT HEADER ON SCREEN2660 ;}2670 HEADER LDA #12680 STA ROWCRS ;ROW 12690 LDA #102700 STA COLCRS ;COLUMN 102710 LDA #B5&$FF2720 STA STL2730 LD}A #B5/2562740 STA STH2750 LDA #16 ;BUFFER LENGTH2760 STA BLL2770 LDA #02780 STA BLH2790 JSR WRITES2800 INC ROWC}RS ;LEAVE A SPACE2810 RTS2820 ;2830 B5 .BYTE "Binary Load Menu"2840 NUMKEY .BYTE "A"2850 OFFSET .BYTE 0 ;OFFSET FOR FIL}E NAMES2860 ;2870 ; WRITE DIRECTORY ENTRIES ON SCR2880 ;2890 DIRSCN JSR CHKSYS ;CHECK IF A SYS FILE2900 JSR CHKFRE ;CHE}CK IF "FREE SECTOR" ENTRY2910 LDA #FNAME&$FF2920 STA STL2930 LDA #FNAME/2562940 STA STH2950 LDA #10 ;ONLY USE NAME,} NOT EXT2960 STA BLL2970 LDA #02980 STA BLH2990 INC ROWCRS3000 LDY #63010 LDA NUMKEY3020 CMP #783030 BCC FIRC}OL3040 LDY #24 ;SECOND COLUMN3050 LDA ROWCRS3060 CMP #163070 BNE FIRCOL3080 LDA #33090 STA ROWCRS3100 FIRCOL STY} COLCRS3110 LDA NUMKEY ;LETTER OF ENTRY3120 STA FNAME ;PUT IN BUFFER3130 LDA #45 ;DASH3140 STA FNAME+13150 JSR PUTB}UF ;PUT NAME IN BUFFER3160 JSR WRITES ;PUT IT ON SCREEN3170 INC NUMKEY ;ADVANCE FOR NEXT3180 RTS3190 ;3200 ; CHECK IF} SYS FILE3210 ;3220 CHKSYS LDA FNAME+103230 CMP #83 ;S3240 BNE NOTSYS3250 LDA FNAME+113260 CMP #89 ;Y3270 BNE NOT}SYS3280 LDA FNAME+123290 CMP #83 ;S3300 BNE NOTSYS3310 PLA ;SYS FILE, SO PULL RETURN ADDRESS AND3320 PLA ;DON'T WRI}TE IT ON SCREEN3330 NOTSYS RTS3340 ;3350 ; CHECK IF "FREE SECTOR" ENTRY3360 ;3370 CHKFRE LDA FNAME+13380 CMP #$20 ;IT }SHOULD BE A SPACE3390 BEQ NOTFRE3400 PLA3410 PLA ;SKIP REST OF DIRSCREEN3420 NOTFRE RTS3430 ;3440 ; WRITE PROMPT MES}SAGE ON SCREEN3450 ;3460 FOOTER LDA #203470 STA ROWCRS3480 LDA #43490 STA COLCRS3500 LDA #B6&$FF3510 STA STL3520} LDA #B6/2563530 STA STH3540 LDA #313550 STA BLL3560 LDA #03570 STA BLH3580 JSR WRITES3590 RTS3600 ;3610 B6 }.BYTE "Press the Letter of Your Choice"3620 ;3630 ; OPEN KEYBOARD3640 ;3650 OPENK LDX #$303660 LDA #3;OPEN3670 STA IC}CMD,X3680 LDA #B7&$FF3690 STA ICBAL,X3700 LDA #B7/2563710 STA ICBAH,X3720 LDA #4;READ3730 STA ICAX1,X3740 JSR C}IO3750 RTS3760 ;3770 B7 .BYTE "K:" ;KEYBOARD DEVICE3780 ;3790 ; PUT FILE NAMES IN A BUFFER3800 ;3810 PUTBUF LDY #038}20 LDX OFFSET ;FIND CURRENT LOCATION3830 LDA (STL),Y3840 ORA #$80 ;SET LAST BIT3850 STA NBUFF,X3860 INX3870 INY ;F}IRST LETTER DONE3880 INY ;SKIP THE DASH3890 P1 LDA (STL),Y3900 STA NBUFF,X3910 CMP #32 ;SPACE?3920 BEQ P2 ;YES, THEN} DONE3930 INX3940 INY3950 CPY #103960 BCC P13970 LDA #323980 STA NBUFF,X ;MAKE LAST A SPACE3990 P2 STX OFFSET ;S}AVE FOR NEXT TIME4000 INC OFFSET ;FOR NEXT TIME4010 RTS4020 ;4030 LETTER .BYTE 04040 ;4050 ; FIND FILE NAME IN BUFFER}4060 ;4070 FINDNA LDX #04080 L1 LDA NBUFF,X4090 INX4100 CMP LETTER4110 BNE L14120 LDA #68 ;D4130 STA FNAME4140 } LDA #58 ;COLON4150 STA FNAME+14160 LDY #04170 L2 LDA NBUFF,X4180 STA FNAME+2,Y4190 INX4200 INY4210 CMP #$20 ;SP}ACE?4220 BNE L24230 DEY4240 LDA #46 ;PERIOD4250 STA FNAME+2,Y4260 INY4270 LDA #42 ;ASTERISK4280 STA FNAME+2,Y4}290 INY4300 LDA #$20 ;SPACE4310 STA FNAME+2,Y4320 RTS4330 ;4340 ; GET A LETTER FROM THE KEYBOARD4350 ;4360 GETLET }LDX #$30 ;IOCB4370 LDA #7 ;GET BYTES4380 STA ICCMD,X4390 LDA #04400 STA ICBLL,X4410 STA ICBLH,X ;BUFFER LENGTH ZERO}4420 JSR CIO ;A REG WILL CONTAIN LETTER4430 CMP #65 ;LESS THAN "A"?4440 BCC GETLET4450 CMP NUMKEY ;GREATER THAN HIGHE}ST LETTER4460 BCS GETLET4470 ORA #$80 ;SET LAST BIT4480 STA LETTER ;SAVE IT4490 RTS4500 ;4510 ; SET RUN ADDRESS TO }RTS4520 ;4530 SETUP LDA #R&$FF4540 STA $02E0 ;RUN LOW4550 LDA #R/2564560 STA $02E14570 RTS4580 ;4590 ; BUFFER WIT}H NAMES WILL BE AT4600 ; END OF PROGRAM. LETTER WILL4610 ; HAVE LAST BIT SET & BE FOLLOWED4620 ; BY A HYPHEN.4630 ;4640} NBUFF=*4650 ;4660 *=$02E2 ;INIT ADDRESS4670 ;4680 .WORD MENU ;INIT ADDRESS DATA4690 ;4700 .END HYPHEN.4630 ;4640iZ[ 2 YNADUMMLDCOMNDBUFLDBUFHDAUXDAUXFSEXSESECHSECLBUBUFHBUFLFHFLUSEUHUL }  } * DISK MISER* by Sait Halman* ANALOG Computing #17(2 }* ONE-TIME INITIALIZATION<11;@,;@,;@,;@6,FQAi@!6-Ap-6-Ar96- }AsE6-AxQ6-AyPS-@@"'67,.>:,+ ?-@@6C"O67,.>:,S Zd }* PER DISK INITIALIZATIONn6-A@xT( }Ԡ2(٠Šө6EB:,"T6 }.BOOTDISK* GET SECTORS 360-361QA@'3@U?6-?:C:,,QB@ }3A@'A(3@U6-?:C:,, * ADD EXTENDER TO FILENAME* AND PASS TO }DIRECTORYA-@@+BB%@2/ ABBA.-@B:,*BB%@:7<,,. 8 }6.DUM-@B:,4BB %@:7<,,8 * GET 8 SECTORS AT A TIME* AND CHECK FOR BLANKS+- }@@+-@@6-@$%$6-P:'AV,46-&AV$:@"F6-BC6%A($* }6-P:'AV,:6-&AV$@F,S6-?:C:,, B@y1?:C:,,AUEB@%S6-&@ }6 @J* MANUAL CORRECTIONSTo'(} ŠŠƠ ;-@O-@%@[(@ }$o-@^C!-@$%@%@;(F:B@%@$%,? C hK-@@"3( }ΠϠũ7K"A r4F:B@%,&B@%46-&@| A@ * FIN }D # FREE/USED SECTORS* AND PASS TO DIRECTORYS6-P:'AV,$6-&$AV26-A &C6-P:'AV,S6-& }$AVB@B@BB BB* WRITE SECTORS 360-361K@A }'@3?@UK6-?:C:,,?A@'A(3@U?6-?:C:,,* A }LL DONE; NEED ANOTHER?(}ŠӺ( ĠӺ;( Ҡ;7@<@,4YA }&0* MACHINE CODE FOR A$:104,32,83,228,96DN* MACHINE CODE FOR ML$X@@104,162,0,134,213,189 },0,56,208,21,189,0,57,208,16,189,0,58bBB208,11,189,0,59,208,6,232,208,233,202,208,2,162,0,134,212,96 D2:MISER.BAS9 |0100 ; DISK MISER BY SAIT HALMAN0110 ; ASSEMBLY SOURCE FOR ML$0120 ;0130 FR0 = $D4 ; BASIC RETURN REGISTER0140 BUF1} = $3800 ; SECTOR 1/2 BUFFER0150 BUF2 = $3900 ; SECTOR 3/4 BUFFER0160 BUF3 = $3A00 ; SECTOR 5/6 BUFFER0170 BUF4 =} $3B00 ; SECTOR 7/8 BUFFER0180 ;0190 *= $3600 ; COULD GO ANYWHERE0200 ;0210 PLA ; # USR PARAMETERS;} IGNORE0220 LDX #0 ; ZERO MSB OF RESULT0230 STX FR0+1 ; AND INIT LOOP0240 LOOP0250 LDA BUF1,X ; IF BY}TE IS NZ,0260 BNE DATA ; MARK BLOCK0270 LDA BUF2,X ; CHECK 2ND PAGE0280 BNE DATA0290 LDA BUF3,X ; 3R}D PAGE0300 BNE DATA0310 LDA BUF4,X ; 4TH PAGE0320 BNE DATA0330 INX ; CONTINUE LOOP0340 BNE }LOOP ; UNTIL DONE0350 ;0360 ; ALL SECTORS EMPTY, SO0370 ; TELL BASIC WITH A "TRUE" FLAG0380 ;0390 DEX ; X} = $FF0400 BNE EXIT0410 ;0420 ; DATA BYTE DISCOVERED, SO0430 ; PASS A ZERO BACK TO BASIC0440 ;0450 DATA0460 LD}X #00470 EXIT0480 STX FR00490 RTS ; RETURN TO BASIC0500 ;0510 .END SIC0440 ;0450 DATA0460 LD]7|SECRWBUFId* HOW TO LIVE WITHOUT DOSn* BY DAN HIGGINSx}* ANALOG COMPUTING #17* * THIS SAMPLE PROGRAM WILL* SHOW YOU HOW TO READ OR""* WRITE DISK SECTORS WITH}OUT* GOING THROUGH DOS.** A BASIC USR FUNCTION IS!!* USED TO READ OR WRITE ONE* DISK SECTOR AT A }TIME* * FORM OF THE USR CALL IS:*##* IO=USR(ADDR,BUFF,SECT,FLAG)** SYNTAX:*"* IO } = A DUMMY VARIABLE,* ADDR = ADDRESS OF THE6* M/L SUBROUTINE@""* BUFF = ADDRESS OF 128-BYTEJ* } SECTOR BUFFERT* SECT = SECTOR NUMBER TO^* ACCESS (1-720)h!!* FLAG = I/O DIRECTION FLAGr* FL}AG=0 TO READ|* FLAG=1 TO WRITE*!!* FIRST WE MOVE THE MACHINE""* LANGUAGE SUBROUTINE INTO A* S}TRING (SECRW$)*;@D,-@@D"67,.>:, *!!* NOW WE RESERVE A 128-}BYTE* BUFFER AREA TO HOLD THE* SECTOR DATA*;A(,&*0 * THE FOLLOWING LINES WILL:""* W}RITE THE CONTENTS OF BUF$D* TO DISK SECTOR 720N*X6.TESTING 1 2 3 4b$$6-?:C:,:@:7<,,%A(,-( }INPUT ERROR - # B- @6-$@%+&@, "(DECIMAL VALUE:" @ D2:HEXDEC.!}BASUT ERROR - # B- @6-$@%+&@, "(DECIMAL VALUE:" @ D2:HEXDEC. 10 *= $60020 LDX #530 COPY LDA TABLE1,X40 STA TABLE2,X50 DEX60 BPL COPY70 BRK80 TABLE1 %}.BYTE 10,20,30,40,50,6090 TABLE2 *=*+60100 .END STA TABLE2,X50 DEX60 BPL COPY70 BRK80 TABLE1 $710 *= $60020 LDX #530 LDY #040 COPY LDA TABLE1,X50 STA TABLE2,Y60 INY70 DEX80 BPL )}COPY90 BRK0100 TABLE1 .BYTE 10,20,30,40,50,600110 TABLE2 *=*+60120 .END60 INY70 DEX80 BPL (X:K_TABLE1TABLE2@@ 9@,9@,68,-@-6-}8@,-@ B68@,-@0W68@,-@@l68@,-@P68@,-@`6-@6--}( 6-8,2 68,-<6-%@F6-&@P@@Z D2:BOOT4.BAS6-,s01 *= $60010 CLD ;BINARY MODE20 LDA #255 ;GET 255,30 CLC ;FIRST ADD!40 ADC #11 } ;ADD 1 TO 25550 STA RESLO ;STORE LOW RESULT60 LDA #0 ;GET OP1 HIGH70 ADC #0 ;ADD OP1 }2 HIGH,80 STA RESHI ;SAVE HIGH RESULT90 BRK ;ALL DONE!0100 RESLO *=*+1 ;LOW RESULT BYTE0110 RES1 }HI *=*+1 ;HIGH RESULT BYTE0120 .END ;END OF ASSEMBLYALL DONE!0100 RESLO *=*+1 ;LOW RESULT BYTE0110 RES0E01 *= $60010 CLD ;BINARY MODE20 LDA #$F5 ;GET OP1 LOW30 SEC ;FIRST SUBTRACT40 5 } SBC #$FF ;SUB OP2 LOW50 STA RESL ;SAVE LOW RESULT60 LDA #$03 ;GET OP1 MIDDLE70 SBC #$45 5};SUB OP2 MIDDLE80 STA RESM ;SAVE MID RESULT90 LDA #$42 ;GET OP1 HI0100 SBC #$2E ;SUB OP2 HIGH0115}0 STA RESH ;SAVE HIGH RESULT0120 BRK ;ALL DONE!0130 RESL *=*+1 ;LOW RESULT BYTE0140 RESM *=*+1 5} ;MID RESULT BYTE0150 RESH *=*+1 ;HIGH RESULT BYTE0160 .END ;END OF ASSEMBLYSULT BYTE0140 RESM *=*+1 4`10 *= $60015 CLD ;BINARY MODE20 LDA SCORE ;GET SCORE LO25 CLC ;CLEAR 1ST TIME30 9}ADC POINTS ;ADD POINTS35 STA SCORE ;SAVE SCORE LO40 LDA SCORE+1 ;GET SCORE MID45 ADC #0 ;ADD9} DUMMY ZERO50 STA SCORE+1 ;SAVE SCORE MID55 LDA SCORE+2 ;GET SCORE HIGH60 ADC #0 ;ADD DUMMY ZERO659} STA SCORE+2 ;SAVE SCORE HIGH70 BRK ;ALL DONE!75 POINTS *=*+1 ;ONE BYTE80 SCORE *=*+3 ;THRE9}E BYTES85 .END ;END OF ASSEMBLY ;ALL DONE!75 POINTS *=*+1 ;ONE BYTE80 SCORE *=*+3 ;THRE8.12%&DSDATHEXLINDATLIDDBYTPASCHKSUTOTAIN@=} *** PLANETARY DEFENSE ***I @ 1(MAKE CASSETTE (0), OR DISK=} (1)5I!@@ C BC0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,0,10,11,12,13,14,15(r;@,9@",/=}-@"3"<68,-@ L6-A V#A` A r( CHECKING DATA286-%@(LINE:!"8B:,=}@A <F%6-F:A,%F:A,$AV+C(LINE  MISSING!FFq-@@@56-@:=}7<,,&@H[6-@:7%@<%@,,&@Hq6-8,$@%8,P."@*@ $". @PZ% =}6-%!A %6-&Ad  ""@Pn A x F:A,@A "Ap=}(A`*@A$)*@@<*@A%O*@@b*@@u*@=}@3@<-@@4**@. 9@<(Ag+("INSERT DISK WITH DO=}S, PRESS RETURN8;@,<g@@ D:AUTORUN.SYS*@AU)*@AU<*@= }O*@@2b*@Au*@@E A{((READY CASSETTE AND PRESS RETURNH@=!}@A(C:R#A0f-@@@j"w*@{ M(( WRITING FILE#6-@/6-A 9="}#AC A M @P(BAD DATA: LINE ``0,28,216,31,255,31,169,0,141,47,2,169,60,141,2,211,169,0,141,23=#}1,2,133,14,169,56,141,232,2..133,15,169,18,133,10,169,33,133,11,24,96dd707070707070707070461C207007700610067070062006=$}400641002000212E212C2F2700232F2D303534292E27,480cc07330040706C616E65746172794040646566656E73654080A2B980A3A8A1B2ACA5B380A=%}2A1A3A8A1AEA480C0C0,82ddC0E1EEE4C0F4EFEDC0E8F5E4F3EFEEC0C0C0406B6F616C6140706164404D4073656C65637440C0EAEFF9F3F4E9,570=&}ddE3EBC0CDCDCDC0F3F4E1F2F4C000002F3200303225333300343229272725320000707046452E4D00308D8D8D8D,161dd8D8D8D8D8D8D8D8D8D8D8D='}8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D,506dd8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8=(}D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D,851$dd8D41A820D8A9008D0ED4A27F9580CAD0FBE6BBA9FF859C85A985B985BA20EA298D07D2A9=)}C48DC402A9848DC502,315.ddA90A8DC602A9988DC702A9508D0002A9238D0102A9C08D0ED4A9328D00D48D2F02A9008D1DD08D08D2A2049D0D,9708=*}ccD0CA10FA2065E4A9008D3002A9208D3102A223A076A907205CE4A93C858CA58CD0FCAD7C024D7D02D010AD8402,64BccF00BAD1FD02903C903F0EA2=+}90185B0A90A858CA58CD0FCAD1FD0C907D0F1A9308581A9008580A20FA89180C8D0,21LddFBE681CA10F6A2009D00039D00049D00059D00069D0007CAD=,}0EEA9A88D3002A9208D3102A9008D07D4A93E8D2F,584Vdd028D00D4A9038D1DD0A9118D6F02A90085BBA98F85828584A93785838585A200A000BD5F22=-}D0034C9522300991,324`dd829184C8E84C11220A85870A0AA955B002A90048BD5F22290F85866891829184C8C686D0F7E8A58710CB38A582,647jdd=.}E9288582B002C68318A5846928858490B5E6854C0F22EAEAEAEAEA15A854C115A854C105A850C105A850C101A8,397tdd40C181E88115A654C18105A6=/}50C18101A640C182E68205A450C183E484E200A240A00018A9607D0F2399401F9D,638~dd801FA9507DCE229D001E99401E38A950FDCE229D801E99C01=0}EA960FD0F239D001F99C01FC8CA10CE4C34250001,255cc02020304050506070809090A0B0C0C0D0E0E0F10101112121314141515161717181819191A=1}1A1B1B1B1C1C1D1D,15dd1D1E1E1E1E1F1F1F1F1F20202020202020203636363636363636353535343434333332323131302F2F2E2D2C2C,943dd=2}2B2A292827262625242321201F1E1D1C1B1A18171615141211100F0D0C0B0908070504030100488A48E6AAA5AA,834dd2907AABD6E2305B18D0AD48D1=3}6D0A98C8D17D068AA68400002040608060402D8A6ABBD8F2C8DC302A90585AAA9,370ddC08D0ED4ADFC02C921D00BA5B249FF85B2A9FF8DFC02A5B2F0=4}0DA900A2079D00D2CA10FA4C62E4A5BBD009ADC6,721dd021869108DC602A5B8F00C4A4A8D07D2A9288D06D2C6B8A5A910034C3324A491A205A90F39F=5}D0299FD02C8CA10,578ddF4AD7802A690A4914AB00288884AB002C8C84AB001CA4AB001E8E0309006E0D0B0028690C0209006C0E0B00284,258dd=6}91A5B0F003207B2BA5BCD01CA205A491BD892C19FD0299FD02C8CA10F3A690CA8E07D0E8E88E06D0A5AEF002C6,437ddAEA58CF002C68CA58DF002C68=7}DA58EF002C68EA5A910034C62E4A5A5F03AE689A48918B9001E8596692F8D05D0,351dd69028D04D0B9001F4A85972A6924AAE68FA58F2908A8A90885=8}88BD000329F01924259D0003CAC8C688D0EFA5AB,332ddF030ACF42D8888A209C020900AC0DFB006BD912C99000788CA10EEADE82D8D03D0E6ACA5AC4=9}A2903AABD9B2C8D,987dd952C8D962CA6BA1007A9008D01D2F00DA9A68D01D2BD752D8D00D2C6BAA6B91007A9008D03D2F00DA9A68D03D2,276dd=:}BD832D8D02D2C6B9A5ABF00BADF42DC9249004C9E79007A9008D05D2F017E6B7A6B7E00C3004A20086B7A9A88D,189 dd05D2BD912D8D04D24C62E4000=;}0000A040A0000000000040A040000A900859D859E859F858C85B285BD85AB859B,122ddA20B9DD92DCA10FAA213BD0D2D9D452ECA10F7A901859A85A5=<}A904859CA90C8DC602A9348DC0028DC1028DC202,315ddA97F8590A9818591A90185A920482BA9548D9337A9158D94378D1ED0205E2BA69BBD212D85C==}6BD2D2D85C7BD39,537(dd2D85ADBD452DC9FFD005AD0AD229F085B1BD5D2D85A6BD512D85A7BD692D85A8E00BF002E69BF8A59A18690185,4172dd=>}9AD8A5B2D0FCA900854DA5A91007A5BDD0034CD229AD93372903C903F009AD943729C0C9C0D00FA90085C685A5,113<ddA9FF859C85A920EA29AD1FD0C=?}907F0034C1221204327A5A5F010AD8402C599F0098599C900D00320652820AE28,172FddA58DD01720802920F629207626201B29A5ABF003202328A901=@}858DA5C6D089A5A93085ADD92D0DDA2D0DDB2D0D,871PccDC2DF0034CCF254C8F25A94085B8E6BDA4BDA5BE999D2DA5BF99B12DA90099C52D60A90085C=A}1E6C1A5BDC5C130,88ZddF3A6C1A90085C0BDC52DC925302EE6C038E925C92530258AA8E8E4BDF0021015BD9D2D999D2DBDB12D99B12DBD,973dddC=B}52D99C52DC8D0E4C6BDC6C14C7A26FEC52DA8BD9D2D1879C32C85C2C9A0B0ACBDB12D79E82C85C3C960B0A020,536nddF326A5C0D00ABDAF2C118A918A=C}4C7A26BDB32C318A4CE626A5C30A858AA900858B068A268B068AA58A85C5268B,774xddA58B85C4068A268B068A268BA58A1865C5858AA58B65C4858BA=D}90018658A858AA930658B858BA5C22903AAA5C2,182dd4A4A18658A858A9002E68BA00060A5AED004A5C6D00160A203BDD92DF004CA10F860A9019DD9=E}2DC6C6A9009D15,608dd2E9D212EA5A93053E003D04FAD0AD2C5ADB048A90185ABAD0AD22903A8B99F2CC9FFD005201928692385929DE5,918dd2=F}DB9A32CC9FFD005201928693785939DF12DB9A72CC9FFD005A9E638E5938594B9AB2CC9FFD002A59285954C01,917dd28AD0AD23019AD0AD22901A8B9=G}672C9DF12DAD0AD2C9FAB0F99DE52D4CF127AD0AD22901A8B9672C9DE52DAD0A,406ddD2C9FAB0F99DF12DBDE52D8592BDF12D8593A9808594859520E=H}E2AA5CA9D2D2EA5CB9D392EA5C89DFD2DA5C99D,190dd092E60AD0AD2297FC964B0F760AD0AD2C906B00DA207BDDD2DF007CABDDD2DF00160A9308595=I}A9508594ADE82D,855cc38E92C85929DE92DC9A0B0E8ADF42DE9254A85939DF52DC95FB0D9A90D85B94C9128A205BDDD2DF004CA10F860,82ddA9=J}0D85BAA59685929DE92DA59785939DF52DA59038E9308594A59138E9204A859520EE2AA5C89D012EA5C99D0D,986dd2EA5CA9D312EA5CB9D3D2EA9019=K}DDD2D60A58ED0FBA59C1004A901D002A5C7858EA203BDD92DF052208F2AA59C,574bb1009208F2A208F2A208F2ABDF12D1869028582A900858A8A0904=L}858B8684E003D004A5ABD027BC2D2EA9118587,3ddBE852CA482C0209009C0DFB005BD692C918A88CAC687D0EDA684BDE52D9D00D0CA10A660A20BBDD=M}92DF058BDE5,350dd2D85C2BDF12D85C3869820F326B18A3DB32C918AA698208F2ABDE52DC9A0B02285C2BDF12DC960B01985C320F3,478dd26BD=N}AF2C318AF015A698A5C285BEA5C385BF205E26A9009DD92D4C7A29BDAF2CA6983DB72C118A918ACAE003D0,136cc9E60A58CF00160A59C30FBA90185A=O}5AD08D00D09D0F0EFA90085A58589A69C9D532EC69C1009A9FF85C685A920,31ddEA29A59685BEA59785BF205E26A9508596A9158597A200BD000329F=P}09D0003CAD0F5A9FF858C6020EA29AD8402,611dd2D7C022D7D02F007AD1FD0C907F0EE4C1221A9008D01D28D03D28D05D260A203A5ABF01EA90085AF=Q}A5A9304DAD,633"ddE82DC9279046C9D3B042ADF42DC913903BC9E7B037A90085AFBD04D02905F063E6AF2904F026A5A93022A90285,277,ccAEE00=R}3D00BA5ABF007A5A885A14C4A2AA5A685A2A5A785A1869820362BA698A9009DD92DBC2D2EBDE52D38F987,546dd2C85BEBDF12D38E9284A85BFA5ABF00=S}FE003D00BA90085AB20DA2AA5A9300A20DA2AA5AFF003205E26CA108F8D,358@bb1ED060BD152E187DFD2D9D152EA9002A85CCBD212E7D092E9D212EA9=T}002A85CDBD2D2EF008BDE52D65CC4CBF2A,5JddBDE52D38E5CC9DE52DBD392EF009BDF12D38E5CD4CD62ABDF12D1865CD9DF12D60A9009D00D0A88A090=U}4858B98,847Tdd858A918A88D0FB60A90085CAA592C5949005E5944C042BE6CAA59438E59285C8A90185CBA593C5959005E5954C,177^dd1C2BC6CB=V}A59538E59385C905C8D004A98085C8A5C8300BA5C9300706C806C94C262B60A000F818A202B59D75A0,498hdd959D94A0CA10F5D8A91085A4A201A000B=W}99D0020662BE8E8C8C003D0F360A05084A4A59AA20B85A3290F05A49D,227rdd462EA5A34A4A4A4A05A49D452E60A204B5CD95CEB5D295D3CAD0F5A491=X}A205B9000329F0990003CA10F5A90185,684|ddBCAD700285CEC9059052AD710285D3C9059049A9CE85B5A90085B620F72BB03C6910C930B002A930C9D=Y}09002A9,205ddCF8590A9D385B5A90085B620F72BB01F6910C920B002A920C9E09002A9DF8591AD7C024D7D0249018D8402A900,391dd85BC60A9=Z}00A20495DDCA10FB85B385B4A8A201B1B599D800C8205A2CB1B50A36DD71B59002F6DD0A36DD95D8E8,463ddC8205A2CB1B599D800A204B5D865B385B=[}3B5DD65B485B4CA10F1A204A5B346B46ACAD0FAAAA00438F1B5B00449,757ccFF6901C918B0048A8810EF60B1B50A36DD0A36DD95D8E8C86000FA0000=\}00000000DC3E7E3EDC00000000000076,27ddF8FCF8760000000000001B102F2A4040A0A0404034F80000187E00007E1800009249249228FFD2FFFF14=]}FFE6FF,377ccD2FF2814FFE6FFC0300C033FCFF3FC00000000FFFFFFFFFFFFAAAA0001FF00FF010002FFFE000100FE020101FF,69dd0002FEFF03=^}00FDFE0302FFFE01FF03FD01FD02000001FF00010100FF0102FFFEFF0102FE0203FF00FE01FD00FE,931ddFF020302FDFD000103FFFE0000000000000=_}0006C766C000000CACACACACA000A0F141914190F141914191E0C0B,829dd0A090807070605050403000A325A3250283C6450787D20304050607080A0=`}B0C0D0FF0000000000000000000101,251dd01102030405060708090001020000101010202030303040404F4FED2DCB0BA8E986C764A5428326560555=a}04540,601dd35302520151005000A0B0C0E10111211100E0C0B00000000000000000000000000000000000000000000000000,981D2:DEFEN=b}SE.BAS01dd35302520151005000A0B0C0E10111211100E0C0B00000000000000000000000000000000000000000000000000,981D2:DEFEN<0100 ;0110 ; File: PLANET1.M650120 ;0130 .OPT NO LIST0140 ; ------------------0150 ; ANALOG Computing's0160 ; PLANEAd}TARY DEFENSE0170 ; ------------------0180 ;0190 ; by Charles Bachand0200 ; and Tom Hudson0210 ;0220 ; Written with OAe}SS MAC/650230 ;0240 ; ------------------0250 ; Hardware Registers0260 ; ------------------0270 ;0280 HPOSP0 = $D000 ;PAf}0 horizontal0290 HPOSM0 = $D004 ;M0 horizontal0300 P0PF = $D004 ;P0-PField coll.0310 M0PL = $D008 ;M0-PLayer coll.Ag}0320 GRAFP0 = $D00D ;PM graphics0330 COLPF0 = $D016 ;PF color 00340 GRACTL = $D01D ;graphic control0350 HITCLR = $D01E Aq}BJDOS SYSB!NBFMENU BASBKoBFMENU ASMBMISER BASB MISER ASMBWITHOUT BASB WITHOUT ASMB KAL ACTBHEXDEC BASBBOOT1 ASMBBOOT2 ASMBBOOT4 BASBBOOT8 ASMB BOOT9 ASMBBOOT12 ASMBMDEFENSE BASBcDEFENSE1ASMB)DEFENSE2ASM ;clear hit reg0360 CONSOL = $D01F ;console buttons0370 AUDF1 = $D200 ;frequency 10380 AUDC1 = $D201 ;volume 10390 AAr}UDCTL = $D208 ;audio control0400 RANDOM = $D20A ;random numbers0410 DMACTL = $D400 ;DMA control0420 PMBASE = $D407 ;PMAs} base address0430 WSYNC = $D40A ;wait hor. sync0440 NMIEN = $D40E ;interrupt reg.0450 ATRACT = $4D ;attract flag04At}60 ;0470 ; ------------------------0480 ; Operating System Vectors0490 ; ------------------------0500 ;0510 SETVBV = $E4Au}5C ;set v.blank0520 XITVBV = $E462 ;exit v.blank0530 SIOINV = $E465 ;serial I/O init0540 ;0550 ; ----------------0560Av} ; Shadow Registers0570 ; ----------------0580 ;0590 VDSLST = $0200 ;DLI vector0600 SDMCTL = $022F ;DMA control0610 SDAw}LSTL = $0230 ;DList pointer0620 GPRIOR = $026F ;gr. priority0630 PADDL0 = $0270 ;paddle 00640 PADDL1 = $0271 ;paddle 1Ax}0650 STICK0 = $0278 ;joystick 00660 PTRIG0 = $027C ;paddle trig 00670 PTRIG1 = $027D ;paddle trig 10680 STRIG0 = $0284Ay} ;stick trig 00690 PCOLR0 = $02C0 ;player colors0700 COLOR0 = $02C4 ;playfield "0710 CH = $02FC ;keyboard char072Az}0 ;0730 ; -------------------0740 ; Page Zero Registers0750 ; -------------------0760 ;0770 *= $80 ;top of pageA{} 00780 ;0790 INDEX *= *+2 ;temp index0800 INDX1 *= *+2 ;temp index0810 INDX2 *= *+2 ;temp index0820 COUNT *= *+A|}1 ;temp register0830 TEMP *= *+1 ;temp register0840 SATEMP *= *+1 ;temp register0850 SCNT *= *+1 ;orbit indexA}}0860 LO *= *+1 ;plot low byte0870 HI *= *+1 ;plot high byte0880 DEADTM *= *+1 ;death timer0890 EXPTIM *= *+A~}1 ;explosion timer0900 BOMTIM *= *+1 ;bomb timer0910 SATPIX *= *+1 ;sat. pic cntr0920 CURX *= *+1 ;cursor x0930A} CURY *= *+1 ;cursor y0940 FROMX *= *+1 ;vector from X0950 FROMY *= *+1 ;vector from Y0960 TOX *= *+1 ;vectA}or to X0970 TOY *= *+1 ;vector to Y0980 SATX *= *+1 ;satellite x0990 SATY *= *+1 ;satellite y1000 XHOLD *= *A}+1 ;x reg hold area1010 LASTRG *= *+1 ;last trigger1020 LEVEL *= *+1 ;level number1030 BLEVEL *= *+1 ;binary levA}el #1040 LIVES *= *+1 ;lives left1050 SCORE *= *+3 ;score digits1060 SCOADD *= *+3 ;score inc.1070 SHOBYT *= *+1 A} ;digit hold1080 SHCOLR *= *+1 ;digit color1090 SATLIV *= *+1 ;satellite flag1100 BOMVL *= *+1 ;bomb value low111A}0 BOMVH *= *+1 ;bomb value high1120 SAUVAL *= *+1 ;saucer value1130 GAMCTL *= *+1 ;game ctrl flag1140 DLICNT *= *+1A} ;DLI counter1150 SAUCER *= *+1 ;saucer flag1160 SAUTIM *= *+1 ;image timer1170 SAUCHN *= *+1 ;saucer chance1180 A}BOMBWT *= *+1 ;bomb wait time1190 BOMCOL *= *+1 ;bomb collis flg1200 DEVICE *= *+1 ;koala pad sw1210 PLNCOL *= *+1 A} ;planet color1220 PAUSED *= *+1 ;pause flag1230 AVG *= *+2 ;average1240 PTR *= *+2 ;queue pointer1250 SSSCNTA} *= *+1 ;saucer snd cnt1260 EXSCNT *= *+1 ;expl. snd count1270 ESSCNT *= *+1 ;enemy shot snd1280 PSSCNT *= *+1 ;plA}ayer shot snd1290 TITLE *= *+1 ;title scrn flag1300 PENFLG *= *+1 ;pen up/dwn flg1310 EXPCNT *= *+1 ;explosion counA}ter1320 NEWX *= *+1 ;explosion x1330 NEWY *= *+1 ;explosion y1340 PLOTCLR *= *+1 ;plot/erase flag1350 COUNTR *= A}*+1 ;explosion index1360 PLOTX *= *+1 ;plot x coord1370 PLOTY *= *+1 ;plot y coord1380 HIHLD *= *+1 ;plot work A}area1390 LOHLD *= *+1 ;plot work area1400 BOMBS *= *+1 ;bombs to come1410 BOMTI *= *+1 ;bomb speeds1420 VXINC *=A} *+1 ;vector x hold1430 VYINC *= *+1 ;vector y hold1440 LR *= *+1 ;vector left/right hold1450 UD *= *+1 A};vector up/down hold1460 DELTAX *= *+1 ;vector work area1470 DELTAY *= *+1 ;vector work area1480 XQ *= *+5 ;x quA}eue1490 YQ *= *+5 ;y queue1500 SL *= *+5 ;samples lo1510 SH *= *+5 ;samples hi1520 ;1530 ; -----------A}-----------------1540 ; Screen + Player/Missile Area1550 ; ----------------------------1560 ;1570 SCRN = $3000 ;screenA} area1580 PPOS = SCRN+1935 ;planet pos1590 ;1600 PM = $001610 MISL = PM+$0300 ;missiles1620 PLR0 = MISL+$0100 ;plaA}yer 01630 PLR1 = PLR0+$0100 ;player 11640 PLR2 = PLR1+$0100 ;player 21650 PLR3 = PLR2+$0100 ;player 31660 ;1670 ORBX A}= $1E00 ;orbit X1680 ORBY = $1F00 ;orbit Y1690 ;1700 ; -------------1710 ; Start of game1720 ; -------------1730 A};1740 *= $20001750 ;1760 ; ------------------1770 ; Intro Display List1780 ; ------------------1790 ;1800 TLDL .BA}YTE $70,$70,$70,$701810 .BYTE $70,$70,$70,$701820 .BYTE $70,$461830 .WORD MAGMSG1840 .BYTE $70,7,$70,618A}50 .BYTE $10,6,$70,$701860 .BYTE 6,$20,6,$401870 .BYTE 6,$411880 .WORD TLDL1890 ;1900 ; ----------------A}--1910 ; Intro Message Text1920 ; ------------------1930 ;1940 MAGMSG .SBYTE " ANALOG CO"1950 .SBYTE "MPUTING'S "19A}60 .SBYTE +$40," PLANETARY"1970 .SBYTE +$40," DEFENSE "1980 .SBYTE +$80," BY CHARLE"1990 .SBYTE +$80,"S BA}ACHAND "2000 .SBYTE +$C0," AND TOM"2010 .SBYTE +$C0," HUDSON "2020 .SBYTE +$40," KOALA PAD"2030 .SBYTA}E +$40," - SELECT "2040 .SBYTE +$C0," JOYSTICK "2050 .SBYTE +$C0,"--- START "2060 .SBYTE " OR PRESS"2070 A} .SBYTE " TRIGGER "2080 ;2090 ; -----------------2100 ; Game Display List2110 ; -----------------2120 ;2130 GLIST .BYTA}E $70,$70,$462140 .WORD SCOLIN2150 .BYTE $4D2160 .WORD SCRN2170 .BYTE $8D,$8D,$8D,$8D2180 .BYTE $8D,A}$8D,$8D,$8D2190 .BYTE $8D,$8D,$8D,$8D2200 .BYTE $8D,$8D,$8D,$8D2210 .BYTE $8D,$8D,$8D,$8D2220 .BYTE $8D,$A}8D,$8D,$8D2230 .BYTE $8D,$8D,$8D,$8D2240 .BYTE $8D,$8D,$8D,$8D2250 .BYTE $8D,$8D,$8D,$8D2260 .BYTE $8D,$8A}D,$8D,$8D2270 .BYTE $8D,$8D,$8D,$8D2280 .BYTE $8D,$8D,$8D,$8D2290 .BYTE $8D,$8D,$8D,$8D2300 .BYTE $8D,$8DA},$8D,$8D2310 .BYTE $8D,$8D,$8D,$8D2320 .BYTE $8D,$8D,$8D,$8D2330 .BYTE $8D,$8D,$8D,$8D2340 .BYTE $8D,$8D,A}$8D,$8D2350 .BYTE $8D,$8D,$8D,$8D2360 .BYTE $8D,$8D,$8D,$8D2370 .BYTE $8D,$8D,$8D,$8D2380 .BYTE $8D,$8D,$A}8D,$8D2390 .BYTE $8D,$8D,$8D,$8D2400 .BYTE $8D,$8D,$8D,$412410 .WORD GLIST2420 ;2430 ; ---------------------A}---2440 ; Display the Intro Screen2450 ; ------------------------2460 ;2470 PLANET CLD ;clear decimal2480 LDA #A}$00 ;get zero2490 STA NMIEN ;display off2500 LDX #$7F ;set index2510 CLPG0 STA $80,X ;clr top page 02520 A} DEX ;dec pointer2530 BNE CLPG0 ;done? No.2540 INC TITLE ;title on flag2550 LDA #$FF ;get $FA}F2560 STA LIVES ;set dead2570 STA GAMCTL ;game control2580 STA ESSCNT ;no enemy shots2590 STA PSSCNT A} ;no player shots2600 JSR SNDOFF ;no sound on 1232610 STA AUDC1+6 ;turn off snd 42620 LDA #$C4 ;medium greA}en2630 STA COLOR0 ;score color2640 LDA #$84 ;medium blue2650 STA COLOR0+1 ;text color2660 LDA #$0A A} ;bright white2670 STA COLOR0+2 ;shot color2680 LDA #$98 ;light blue2690 STA COLOR0+3 ;text color2700 A}LDA # DLI ;set DLI vector2730 STA VDSLST+1 ;high bA}yte2740 LDA #$C0 ;enable Display2750 STA NMIEN ;List Interrupts2760 LDA #$32 ;PM DMA off2770 STA A}DMACTL ;DMA control2780 STA SDMCTL ;and shadow reg2790 LDA #0 ;get zero2800 STA GRACTL ;graphics ctrlA}2810 STA AUDCTL ;reset audio2820 LDX #4 ;5 PM registers2830 NOPM STA GRAFP0,X ;clr register2840 DEX A} ;dec index2850 BPL NOPM ;done? No.2860 JSR SIOINV ;init sound2870 LDA # TLDL ;DL addr high2900 STA SDLSTL+1 ;DL pntr high2910 LDX # >VBLANK ;vblank A}high2920 LDY # SCRN ;scrn addr high3280 STA INDEX+1 ;pointer high3290 LDA #0 ;get zero3300 STA INDEX ;pointer low331A}0 LDX #15 ;16 pages 0..153320 TAY ;use as index3330 CL0 STA (INDEX),Y ;clear ram3340 INY ;A}next byte3350 BNE CL0 ;page done? No.3360 INC INDEX+1 ;next page3370 DEX ;page counter3380 BPA}L CL0 ;scrn done? No.3390 LDX #0 ;now clear P/m3400 CLPM STA MISL,X ;clear missiles3410 STA PLR0,X ;cleaA}r plyr 03420 STA PLR1,X ;clear plyr 13430 STA PLR2,X ;clear plyr 23440 STA PLR3,X ;clear plyr 33450 DEA}X ;done 256 bytes?3460 BNE CLPM ;no, loop back!3470 LDA # GLIST ;list to show3500 STA SDLSTL+1 ;the playfield.3510 LDA # >PM ;PM address high352A}0 STA PMBASE ;into hardware3530 LDA #$3E ;enable single3540 STA SDMCTL ;line resolution3550 STA DMACTA}L ;DMA control3560 LDA #3 ;enable player3570 STA GRACTL ;and missile DMA3580 LDA #$11 ;set up3590 A} STA GPRIOR ;P/M priority3600 LDA #0 ;get zero3610 STA TITLE ;title off3620 ;3630 ; ---------------364A}0 ; Draw The Planet3650 ; ---------------3660 ;3670 LDA # PPOS ;planet pos high3710 STA INDX1+1 ;pointer #1 high3720 STAA} INDX2+1 ;pointer #2 high3730 LDX #0 ;table pointer3740 DP0 LDY #0 ;index pointer3750 DP1 LDA DPTBL,X ;tableA} value3760 BNE DP2 ;done? No.3770 JMP SETUP ;continue3780 DP2 BMI DPRPT ;repeat? Yes.3790 STA (INDX1)A},Y ;put values3800 STA (INDX2),Y ;onto screen3810 INY ;inc index pntr3820 INX ;inc table pntrA}3830 JMP DP1 ;continue3840 ;3850 ; -------------------3860 ; Repeat Byte Handler3870 ; -------------------3880 ;A}3890 DPRPT ASL A ;shift byte3900 STA TEMP ;new line flag3910 ASL A ;NL bit -> carry3920 ASL A A} ;color -> carry3930 LDA #$55 ;color 1 bits3940 BCS FILL1 ;color 1? Yes.3950 LDA #0 ;get backgrouA}nd3960 FILL1 PHA ;save color byte3970 LDA DPTBL,X ;table value3980 AND #$0F ;mask 4 bits3990 STA COUA}NT ;save as count4000 PLA ;restore color4010 FILL2 STA (INDX1),Y ;put bytes4020 STA (INDX2),Y ;onto screA}en4030 INY ;inc index4040 DEC COUNT ;dec byte count4050 BNE FILL2 ;done? No.4060 INX A};inc table index4070 LDA TEMP ;get flag4080 BPL DP1 ;new line? No.4090 SEC ;set carry4100 A}LDA INDX1 ;Yes. get low4110 SBC #40 ;subtract 404120 STA INDX1 ;new low4130 BCS DPN1 ;overflow? No.A}4140 DEC INDX1+1 ;decrement high4150 DPN1 CLC ;clear carry4160 LDA INDX2 ;get low4170 ADC #40 ;aA}dd 404180 STA INDX2 ;new low4190 BCC DP0 ;overflow? No.4200 INC INDX2+1 ;increment high4210 JMP DP0A} ;continue4220 ;4230 ; ----------------4240 ; Planet Draw Data4250 ; ----------------4260 ;4270 DPTBL .BYTE $EA,$EAA},$EA,$EA4280 .BYTE $EA,$15,$A8,$544290 .BYTE $C1,$15,$A8,$544300 .BYTE $C1,$05,$A8,$504310 .BYTE $C1,$05,A}$A8,$504320 .BYTE $C1,$01,$A8,$404330 .BYTE $C1,$81,$E8,$814340 .BYTE $15,$A6,$54,$C14350 .BYTE $81,$05,$A}A6,$504360 .BYTE $C1,$81,$01,$A64370 .BYTE $40,$C1,$82,$E64380 .BYTE $82,$05,$A4,$504390 .BYTE $C1,$83,$EA}4,$844400 .BYTE $E2,04410 ;4420 ; -------------------------4430 ; Setup Orbiter Coordinates4440 ; ------------------A}-------4450 ;4460 SETUP LDX #64 ;do 65 bytes4470 LDY #0 ;quad 2/4 offset4480 SU1 CLC ;clear carry4490A} LDA #96 ;center Y4500 ADC OYTBL,X ;add offset Y4510 STA ORBY+$40,Y ;quad-2 Y4520 STA ORBY+$80,X ;quadA}-3 Y4530 LDA #80 ;center X4540 ADC OXTBL,X ;add offset X4550 STA ORBX,X ;quad-1 X4560 STA ORBX+$40,YA} ;quad-2 X4570 SEC ;set carry4580 LDA #80 ;center X4590 SBC OXTBL,X ;sub offset X4600 STA ORBA}X+$80,X ;quad-3 X4610 STA ORBX+$C0,Y ;quad-4 X4620 LDA #96 ;center Y4630 SBC OYTBL,X ;sub offset Y4640 A} STA ORBY,X ;quad-1 Y4650 STA ORBY+$C0,Y ;quad-4 Y4660 INY ;quad 2/4 offset4670 DEX ;quad 1/A}3 offset4680 BPL SU1 ;done? No.4690 JMP INIT ;continue4700 ;4710 ; ---------------------------4720 ; OrbiA}ter X,Y Coordinate Data4730 ; ---------------------------4740 ;4750 OXTBL .BYTE 0,1,2,2,34760 .BYTE 4,5,5,6,74770 A} .BYTE 8,9,9,10,114780 .BYTE 12,12,13,14,144790 .BYTE 15,16,16,17,184800 .BYTE 18,19,20,20,214810 .BYTE A}21,22,23,23,244820 .BYTE 24,25,25,26,264830 .BYTE 27,27,27,28,284840 .BYTE 29,29,29,30,304850 .BYTE 30,30A},31,31,314860 .BYTE 31,31,32,32,324870 .BYTE 32,32,32,32,324880 ;4890 OYTBL .BYTE 54,54,54,54,544900 .BYTE 5A}4,54,54,53,534910 .BYTE 53,52,52,52,514920 .BYTE 51,50,50,49,494930 .BYTE 48,47,47,46,454940 .BYTE 44,44,A}43,42,414950 .BYTE 40,39,38,38,374960 .BYTE 36,35,33,32,314970 .BYTE 30,29,28,27,264980 .BYTE 24,23,22,21A},204990 .BYTE 18,17,16,15,135000 .BYTE 12,11,9,8,75010 .BYTE 5,4,3,1,05020 ;5030 ; ----------------------50A}40 ; Display list interrupt5050 ; ----------------------5060 ;5070 DLI PHA ;save Acc5080 TXA ;X --> AA}cc5090 PHA ;save X register5100 INC DLICNT ;inc counter5110 LDA DLICNT ;get counter5120 AND #$0A}7 ;only 3 bits5130 TAX ;use as index5140 LDA DLIBRT,X ;planet bright5150 ORA PLNCOL ;planet colorA}5160 STA WSYNC ;start of scan5170 STA COLPF0 ;color planet5180 LDA #$8C ;bright blue5190 STA COLPF0+A}1 ;shot color5200 PLA ;restore X5210 TAX ;Acc --> X5220 PLA ;restore Acc5230 RTI A} ;return5240 ;5250 DLIBRT .BYTE 0,2,4,6 ;planet5260 .BYTE 8,6,4,2 ;brightness5270 ;5280 ; -------------------A}---5290 ; Vertical blank routine5300 ; ----------------------5310 ;5320 VBLANK CLD ;clear decimal5330 LDX SAUCEA}R ;saucer flag as5340 LDA P3COLR,X ;index 0 or 15350 STA PCOLR0+3 ;saucer color5360 LDA #5 ;get 55370 A} STA DLICNT ;reset DLI count5380 LDA #$C0 ;enable5390 STA NMIEN ;DLI's5400 LDA CH ;keyboard charA}5410 CMP #$21 ;space bar?5420 BNE PCHK ;No. skip it5430 LDA PAUSED ;pause flag5440 EOR #$FF ;invA}ert it5450 STA PAUSED ;save pause flag5460 LDA #$FF ;get $FF5470 STA CH ;reset keyboard5480 PCHK LDAA} PAUSED ;pause flag5490 BEQ NOPAU ;paused? No.5500 LDA #0 ;get zero5510 LDX #7 ;do 8 bytes5520 NOA}SND STA AUDF1,X zero sound5530 DEX ;dec index5540 BPL NOSND ;done? No.5550 JMP XITVBV ;exit VBLANKA}5560 NOPAU LDA TITLE ;title flag5570 BNE NOCYC ;title? Yes.5580 LDA COLOR0+2 No. get color5590 CLC ;A}clear carry5600 ADC #$10 ;next color5610 STA COLOR0+2 ;explosion col.5620 NOCYC LDA EXSCNT ;explosion cnt5630 A} BEQ NOPAU2 ;any? No.5640 LSR A ;count/25650 LSR A ;count/45660 STA AUDC1+6 ;explo volume5670A} LDA #40 ;explosion5680 STA AUDF1+6 ;explo frequency5690 DEC EXSCNT ;dec count5700 NOPAU2 LDA GAMCTL ;gamA}e control5710 BPL CURSOR ;cursor? Yes.5720 JMP TIMERS ;No. skip5730 ;5740 ; --------------5750 ; Cursor handleA}r5760 ; --------------5770 ;5780 CURSOR LDY CURY ;get y pos5790 LDX #5 ;clear 6 bytes5800 ERACUR LDA #$0F ;now A}clear out5810 AND MISL-3,Y ;old cursor5820 STA MISL-3,Y ;graphics,5830 INY ;next Y position5840 DA}EX ;dec count5850 BPL ERACUR ;loop until done5860 LDA STICK0 ;read joystick5870 LDX CURX ;get X vA}alue5880 LDY CURY ;get Y value5890 LSR A ;shift right5900 BCS NOTN ;North? No.5910 DEY A} ;move cursor up5920 DEY ;two scan lines5930 NOTN LSR A ;shift right5940 BCS NOTS ;South? No.595A}0 INY ;cursor down5960 INY ;two scan lines5970 NOTS LSR A ;shift right5980 BCS NOTW ;WA}est? No.5990 DEX ;cursor left6000 NOTW LSR A ;shift right6010 BCS NOTE ;East? No.6020 INX A} ;cursor right6030 NOTE CPX #48 ;too far left?6040 BCC BADX ;Yes. skip next6050 CPX #208 ;too far rigA}ht?6060 BCS BADX ;Yes. skip next6070 STX CURX ;No. it's ok!6080 BADX CPY #32 ;too far up?6090 BCC BAB}DY ;Yes. skip next6100 CPY #224 ;too far down?6110 BCS BADY ;Yes. skip next6120 STY CURY ;No. it'sB} ok!6130 BADY LDA DEVICE ;KOALA switch6140 BEQ NKOALA ;KOALA PAD?6150 JSR KOALA ;Yes. do it6160 NKOALA LDA PENB}FLG ;koala pen flg6170 BNE TIMERS ;pen up? Yes.6180 LDX #5 ;6 bytes...6190 LDY CURY ;get cursor Y620B}0 SHOCUR LDA CURPIC,X ;cursor pic6210 ORA MISL-3,Y ;mask missiles6220 STA MISL-3,Y ;store missiles6230 INY B} ;next scan line6240 DEX ;dec count6250 BPL SHOCUR ;done? No.6260 LDX CURX ;get x position,62B}70 DEX ;1 less for...6280 STX HPOSM0+3 ;missile 36290 INX ;2 more for...6300 INX ;B}missile 26310 STX HPOSM0+2 ;save position6320 ;6330 ; -----------------------6340 ; Handle timers and orbit6350 ; --B}---------------------6360 ;6370 TIMERS LDA BOMBWT ;bomb wait cnt6380 BEQ NOBWT ;wait over? Yes.6390 DEC BOMBWT B} ;dec count6400 NOBWT LDA DEADTM ;death timer6410 BEQ NOTIM0 ;zero? yes.6420 DEC DEADTM ;decrement it!6430 NOTIB }M0 LDA EXPTIM ;exp timer6440 BEQ NOTIM1 ;zero? Yes.6450 DEC EXPTIM ;decrement it!6460 NOTIM1 LDA BOMTIM ;get bomB }b time6470 BEQ NOTIM2 ;zero? Yes.6480 DEC BOMTIM ;dec bomb time6490 NOTIM2 LDA GAMCTL ;game control6500 BPLB } NOTOVR ;game over? No.6510 JMP XITVBV ;exit VBLANK6520 NOTOVR LDA SATLIV ;get satellite6530 BEQ NOSAT ;alive?B } No.6540 INC SCNT ;inc count6550 LDY SCNT ;orbit index6560 CLC ;clear carry6570 LDA ORBX,Y B } ;get X coord6580 STA SATX ;save Pfield x6590 ADC #47 ;X offset6600 STA HPOSM0+1 ;horizontal pos6610 B} ADC #2 ;+2 offset for6620 STA HPOSM0 ;right side6630 LDA ORBY,Y ;get Y coord6640 LSR A ;divideB} by 26650 STA SATY ;for playfield6660 ROL A ;restore for PM6670 ADC #36 ;screen offset6680 TB}AX ;use as index6690 INC SATPIX ;next sat. image6700 LDA SATPIX ;get number6710 AND #$08 ;use bitB} 36720 TAY ;use as index6730 LDA #8 ;do 8 bytes6740 STA SATEMP ;save count6750 SSAT LDA MISL,X B};missile graphic6760 AND #$F0 ;mask off 1,26770 ORA SATSH,Y ;add sat shape6780 STA MISL,X ;put player #16B}790 DEX ;dec position6800 INY ;dec index6810 DEC SATEMP ;dec count6820 BNE SSAT ;done?B} No.6830 NOSAT LDA SAUCER ;saucer flag6840 BEQ SOUNDS ;saucer? No.6850 LDY BOMBY+3 ;saucer Y pos6860 DEY B} ;-16870 DEY ;-26880 LDX #9 ;10 scan lines6890 SSAULP CPY #32 ;above top?6900 BCC NXTSP ;B}Yes. skip it6910 CPY #223 ;below bottom?6920 BCS NXTSP ;Yes. skip it6930 LDA SAUPIC,X ;saucer image6940 B} STA PLR3,Y ;store player 36950 NXTSP DEY ;next scan line6960 DEX ;dec index6970 BPL SSAULP ;doB}ne? No.6980 LDA BOMBX+3 ;saucer X pos6990 STA HPOSP0+3 ;move it7000 INC SAUTIM ;saucer time7010 LDA SAUTB}IM ;get counter7020 LSR A ;/27030 AND #$03 ;use only 0..37040 TAX ;as X index7050 LDA SB}AUMID,X ;saucer middle7060 STA SAUPIC+4 ;put in7070 STA SAUPIC+5 ;saucer image7080 SOUNDS LDX PSSCNT ;shot sound7B}090 BPL DOS1 ;shot? Yes.7100 LDA #0 ;No. get zero7110 STA AUDC1 ;volume for shot7120 BEQ TRYS2 B} ;skip next7130 DOS1 LDA #$A6 ;shot sound vol7140 STA AUDC1 ;set hardware7150 LDA PLSHOT,X ;shot sound7160 B} STA AUDF1 ;frequency7170 DEC PSSCNT ;dec shot snd7180 TRYS2 LDX ESSCNT ;enemy shots7190 BPL DOS2 ;shots? YB}es.7200 LDA #0 ;No. get zero7210 STA AUDC1+2 ;into volume7220 BEQ TRYS3 ;skip rest7230 DOS2 LDA #$A6 B} ;shot sound vol7240 STA AUDC1+2 ;set hardware7250 LDA ENSHOT,X ;shot sound7260 STA AUDF1+2 ;frequency7270 B } DEC ESSCNT ;dec shot snd7280 TRYS3 LDA SAUCER ;saucer flag7290 BEQ NOS3 ;saucer? No.7300 LDA BOMBY+3 ;saucerB!} Y pos7310 CMP #36 ;above top?7320 BCC NOS3 ;Yes. skip7330 CMP #231 ;below bottom?7340 BCC DOS3B"} ;No. make sound7350 NOS3 LDA #0 ;get zero7360 STA AUDC1+4 ;no saucer snd7370 BEQ VBDONE ;skip next7380 DB#}OS3 INC SSSCNT ;inc saucer cnt7390 LDX SSSCNT ;saucer count7400 CPX #12 ;at limit?7410 BMI SETS3 ;No. sB$}kip next7420 LDX #0 ;get zero7430 STX SSSCNT ;zero saucer cnt7440 SETS3 LDA #$A8 ;saucer volume7450 STB%}A AUDC1+4 ;set hardware7460 LDA SAUSND,X ;saucer sound7470 STA AUDF1+4 ;set hardware7480 VBDONE JMP XITVBV ;continB&}ue7490 ;7500 ; ---------------------7510 ; Satellite shape table7520 ; ---------------------7530 ;7540 SATSH .BYTE 0,0,B'}0,$0A7550 .BYTE $04,$0A,0,07560 .BYTE 0,0,0,$047570 .BYTE $0A,$04,0,07580 ;7590 .INCLUDE #D:PLANET2.M65B(}7600 .INCLUDE #D:PLANET3.M657610 .END 0,0,0,$047570 .BYTE $0A,$04,0,07580 ;7590 .INCLUDE #D:PLANET2.M65@00100 ;0110 ; File: D:PLANET2.M650120 ;0130 ; ----------------0140 ; Initialize Misc.0150 ; ----------------0160 ;0170 F*}INIT LDA #0 ;zero out..0180 STA SCORE ;score byte 00190 STA SCORE+1 ;score byte 10200 STA SCORE+2 ;scoreF+} byte 20210 STA DEADTM ;dead timer0220 STA PAUSED ;pause flag0230 STA EXPCNT ;expl. counter0240 STA SAF,}UCER ;no saucer0250 STA BLEVEL ;bomb level0260 LDX #11 ;no bombs!0270 CLRACT STA BOMACT,X ;deactivate0280 F-} DEX ;next bomb0290 BPL CLRACT ;done? No.0300 LDX #19 ;zero score line0310 INISLN LDA SCOINI,X ;getF.} byte0320 STA SCOLIN,X ;put score line0330 DEX ;next byte0340 BPL INISLN ;done? No.0350 LDA #$01F/} ;get one0360 STA LEVEL ;game level0370 STA SATLIV ;live satellite0380 LDA #4 ;get 40390 STA LF0}IVES ;number of lives0400 LDA #$0C ;set explosion0410 STA COLOR0+2 ;brightness0420 LDA #$34 ;medium reF1}d0430 STA PCOLR0 ;bomb 0 color0440 STA PCOLR0+1 ;bomb 1 color0450 STA PCOLR0+2 ;bomb 2 color0460 LDA #12F2}7 ;center screen X0470 STA CURX ;cursor X pos0480 LDA #129 ;center screen Y0490 STA CURY ;cursor YF3} pos0500 LDA #1 ;get one0510 STA GAMCTL ;game control0520 JSR SHOSCO ;display score0530 LDA #$54 F4} ;graphic-LF of0540 STA SCRN+1939 ;planet center0550 LDA #$15 ;graphic-RT of0560 STA SCRN+1940 ;planet cenF5}ter0570 STA HITCLR ;reset collision0580 ;0590 ; ----------------------0600 ; Set up level variables0610 ; ---------F6}-------------0620 ;0630 SETLVL JSR SHOLVL ;show level0640 LDX BLEVEL ;bomb level0650 LDA INIBOM,X ;bombs / levelF7}0660 STA BOMBS ;bomb count0670 LDA INIBS,X ;bomb speed0680 STA BOMTI ;bomb timer0690 LDA INISC,X ;% cF8}hance of0700 STA SAUCHN ;saucer in level0710 LDA INIPC,X ;planet color0720 CMP #$FF ;level >14?0730 BF9}NE SAVEPC ;No. skip next0740 LDA RANDOM ;random color0750 AND #$F0 ;mask off lum.0760 SAVEPC STA PLNCOL ;planF:}et color0770 LDA INIBVL,X ;bomb value low0780 STA BOMVL ;save it0790 LDA INIBVH,X ;bomb value hi0800 STF;}A BOMVH ;save it0810 LDA INISV,X ;saucer value0820 STA SAUVAL ;save that too0830 CPX #11 ;at level 11?F<}0840 BEQ SAMLVL ;Yes. skip next0850 INC BLEVEL ;inc bomb level0860 SAMLVL SED ;decimal mode0870 LDA LEVF=}EL ;game level #0880 CLC ;clear carry0890 ADC #1 ;add one0900 STA LEVEL ;save game level0910F>} CLD ;clear decimal0920 ;0930 ; -----------------0940 ; Main program loop0950 ; -----------------0960 ;0970F?} LOOP LDA PAUSED ;game paused?0980 BNE LOOP ;Yes. loop here0990 LDA #0 ;get zero1000 STA ATRACT ;attrF@}act mode1010 LDA GAMCTL ;game done?1020 BPL CKCORE ;No. check core1030 LDA EXPCNT ;Yes. expl count1040 FA} BNE CKCORE ;count done? No.1050 JMP ENDGAM ;The End!1060 ;1070 ; --------------------------1080 ; Check planet corFB}e for hit!1090 ; --------------------------1100 ;1110 CKCORE LDA SCRN+1939 ;center LF1120 AND #$03 ;RT color clockFC}1130 CMP #$03 ;explosion colr?1140 BEQ PLDEAD ;Yes. go dead1150 LDA SCRN+1940 ;center RT1160 AND #$C0FD} ;LF color clock1170 CMP #$C0 ;explosion colr?1180 BNE PLANOK ;No. skip next1190 ;1200 ; ---------------1FE}210 ; Planet is Dead!1220 ; ---------------1230 ;1240 PLDEAD LDA #0 ;get zero1250 STA BOMBS ;zero bombs1260 FF}STA SATLIV ;satelite dead1270 LDA #$FF ;get #$FF1280 STA LIVES ;no lives left1290 STA GAMCTL ;game contFG}rol1300 JSR SNDOFF ;no sound1310 ;1320 ; -------------1330 ; Check console1340 ; -------------1350 ;1360 PLANOK LFH}DA CONSOL ;get console1370 CMP #7 ;any pressed?1380 BEQ NORST ;No. skip next1390 JMP PLANET ;restart gFI}ame!1400 ;1410 ; -----------------1420 ; Projectile firing1430 ; -----------------1440 ;1450 NORST JSR BOMINI ;try new FJ}bomb1460 LDA SATLIV ;satellite stat1470 BEQ NOTRIG ;alive? No.1480 LDA STRIG0 ;get trigger1490 CMP LASFK}TRG ;same as last VB1500 BEQ NOTRIG ;Yes. skip next1510 STA LASTRG ;No. save trig1520 CMP #0 ;pressed?FL}1530 BNE NOTRIG ;No. skip next1540 JSR PROINI ;strt projectile1550 NOTRIG JSR BOMADV ;advance bombs1560 LDAFM} EXPTIM ;do explosion?1570 BNE NOEXP ;no!1580 JSR CHKSAT ;satellite ok?1590 JSR CHKHIT ;any hits?1600 FN} JSR EXPHAN ;handle expl.1610 JSR PROADV ;advance shots1620 LDA SAUCER ;saucer flag1630 BEQ RESTIM ;sauceFO}r? No.1640 JSR SSHOOT ;Yes. let shoot1650 RESTIM LDA #1 ;get one1660 STA EXPTIM ;reset timer1670 NOEXP LDA BOFP}MBS ;# bombs to go1680 BNE LOOP ;any left? Yes.1690 LDA GAMCTL ;game control1700 BMI LOOP ;dead? Yes.1FQ}710 LDA BOMACT ;bomb 0 status1720 ORA BOMACT+1 ;bomb 1 status1730 ORA BOMACT+2 ;bomb 2 status1740 ORA BOMFR}ACT+3 ;bomb 3 status1750 BEQ JSL ;any bombs? No.1760 JMP LOOP ;Yes. continue1770 JSL JMP SETLVL ;setup newFS} level1780 ;1790 ; ------------------------1800 ; Initiate a new explosion1810 ; ------------------------1820 ;1830 NEWFT}EXP LDA #64 ;1.07 seconds1840 STA EXSCNT ;expl sound cnt1850 INC EXPCNT ;one more expl1860 LDY EXPCNT ;useFU} as index1870 LDA NEWX ;put X coord1880 STA XPOS,Y ;into X table1890 LDA NEWY ;put Y coord1900 STAFV} YPOS,Y ;into Y table1910 LDA #0 ;init to zero1920 STA CNT,Y ;explosion image1930 RT1 RTS ;returnFW}1940 ;1950 ; ------------------------------1960 ; Main explosion handler routine1970 ; ------------------------------1980FX} ;1990 EXPHAN LDA #0 ;init to zero2000 STA COUNTR ;zero counter2010 RUNLP INC COUNTR ;nxt explosion2020 LDA EXFY}PCNT ;get explosion #2030 CMP COUNTR ;any more expl?2040 BMI RT1 ;No. return2050 LDX COUNTR ;get indexFZ}2060 LDA #0 ;init plotclr2070 STA PLOTCLR ;0 = plot block2080 LDA CNT,X ;expl counter2090 CMP #37 F[} ;all drawn?2100 BMI DOPLOT ;No. do it2110 INC PLOTCLR ;1 = erase block2120 SEC ;set carry2130 F\} SBC #37 ;erase cycle2140 CMP #37 ;erase done?2150 BMI DOPLOT ;No. erase block2160 TXA ;move F]}index2170 TAY ;to Y register2180 ;2190 ; ---------------------------2200 ; Repack explosion table, get2210 ;F^} rid of finished explosions2220 ; ---------------------------2230 ;2240 REPACK INX ;next explosion2250 CPX EXPCNF_}T ;done?2260 BEQ RPK2 ;No. repack more2270 BPL RPKEND ;Yes. exit2280 RPK2 LDA XPOS,X ;get X position2290 F`} STA XPOS,Y ;move back X2300 LDA YPOS,X ;get Y position2310 STA YPOS,Y ;move back Y2320 LDA CNT,X ;get coFa}unt2330 STA CNT,Y ;move back count2340 INY ;inc index2350 BNE REPACK ;next repack2360 RPKEND DEC EFb}XPCNT ;dec pointers2370 DEC COUNTR ;due to repack2380 JMP RUNLP ;continue2390 DOPLOT INC CNT,X ;inc pointer240Fc}0 TAY ;exp phase in Y2410 LDA XPOS,X ;get X-coord2420 CLC ;clear carry2430 ADC COORD1,Y ;Fd}add X offset2440 STA PLOTX ;save it2450 CMP #160 ;off screen?2460 BCS RUNLP ;Yes. don't plot2470 LFe}DA YPOS,X ;get Y-coord2480 ADC COORD2,Y ;add Y offset2490 STA PLOTY ;save it2500 CMP #96 ;off screen?2Ff}510 BCS RUNLP ;Yes. don't plot2520 JSR PLOT ;get plot addr2530 LDA PLOTCLR ;erase it?2540 BNE CLEARITFg} ;Yes. clear it2550 LDA PLOTBL,X ;get plot bits2560 ORA (LO),Y ;alter display2570 PUTIT STA (LO),Y ;and replot itFh}!2580 JMP RUNLP ;exit2590 CLEARIT LDA ERABIT,X ;erase bits2600 AND (LO),Y ;turn off pixel2610 JMP PUTIT Fi};put it back2620 ;2630 ; ------------------------2640 ; Dedicated multiply by 402650 ; with result in LO and HI2660 ; --Fj}----------------------2670 ;2680 PLOT LDA PLOTY ;get Y-coord2690 ASL A ;shift it left2700 STA LO ;savFk}e low *22710 LDA #0 ;get zero2720 STA HI ;init high byte2730 ASL LO ;shift low byte2740 ROFl}L HI ;rotate high *42750 ASL LO ;shift low byte2760 LDA LO ;get low byte2770 STA LOHLD ;save Fm}low *82780 ROL HI ;rotate high *82790 LDA HI ;get high byte2800 STA HIHLD ;save high *82810 AFn}SL LO ;shift low byte2820 ROL HI ;rotate high *162830 ASL LO ;shift low byte2840 ROL HI ;rFo}otate high *322850 LDA LO ;get low *322860 CLC ;clear carry2870 ADC LOHLD ;add low *82880 Fp}STA LO ;save low *402890 LDA HI ;get high *322900 ADC HIHLD ;add high *82910 STA HI ;save higFq}h *402920 ;2930 ; -----------------------------2940 ; Get offset into screen memory2950 ; -----------------------------2Fr}960 ;2970 LDA # SCRN ;screen addr hi3020 ADC HI ;add high offset3030 STA HI ;savFt}e addr hi3040 LDA PLOTX ;mask PLOTX for3050 AND #3 ;the plot bits,3060 TAX ;place in X..3070 Fu} LDA PLOTX ;get PLOTX and3080 LSR A ;divide3090 LSR A ;by 43100 CLC ;and add to3110 Fv} ADC LO ;plot address3120 STA LO ;for final plot3130 BCC PLOT1 ;address.3140 INC HI ;overflFw}ow? Yes.3150 PLOT1 LDY #0 ;zero Y register3160 RTS ;return3170 ;3180 ; ----------------3190 ; Bomb initiaFx}lizer3200 ; ----------------3210 ;3220 BOMINI LDA BOMBWT ;bomb wait time3230 BNE NOBINI ;done? No.3240 LDA BOMBFy}S ;more bombs?3250 BNE CKLIVE ;Yes. skip RTS3260 NOBINI RTS ;No. return3270 CKLIVE LDX #3 ;find..3280 CKLVLFz}P LDA BOMACT,X ;an available..3290 BEQ GOTBOM ;bomb? Yes.3300 DEX ;No. dec index3310 BPL CKLVLP ;donF{}e? No.3320 RTS ;return3330 GOTBOM LDA #1 ;this one is..3340 STA BOMACT,X ;active now3350 DEC BOMBS F|} ;one less bomb3360 LDA #0 ;zero out all..3370 STA BXHOLD,X ;vector X hold3380 STA BYHOLD,X ;vector Y hoF}}ld3390 LDA GAMCTL ;game control3400 BMI NOSAUC ;saucer possible?3410 ;3420 ; --------------3430 ; Saucer handlF~}er3440 ; --------------3450 ;3460 CPX #3 ;Yes. bomb #3?3470 BNE NOSAUC ;No. skip next3480 LDA RANDOM F};random number3490 CMP SAUCHN ;compare chances3500 BCS NOSAUC ;put saucer? No.3510 LDA #1 ;Yes. get oneF}3520 STA SAUCER ;enable saucer3530 LDA RANDOM ;random number3540 AND #$03 ;range: 0..33550 TAY F} ;use as index3560 LDA STARTX,Y ;saucer start X3570 CMP #$FF ;random flag?3580 BNE SAVESX ;No. use as XF}3590 JSR SAURND ;random X-coord3600 ADC #35 ;add X offset3610 SAVESX STA FROMX ;from X vector3620 STA BOMF}BX,X ;init X-coord3630 LDA STARTY,Y ;saucer start Y3640 CMP #$FF ;random flag?3650 BNE SAVESY ;No. use as F}Y3660 JSR SAURND ;random Y-coord3670 ADC #55 ;add Y offset3680 SAVESY STA FROMY ;from Y vector3690 STA BF}OMBY,X ;init Y-coord3700 LDA ENDX,Y ;saucer end X3710 CMP #$FF ;random flag?3720 BNE SAVEEX ;No. use as XF}3730 LDA #230 ;screen right3740 SEC ;offset so not3750 SBC FROMY ;to hit planet3760 SAVEEX STA TF}OX ;to X vector3770 LDA ENDY,Y ;saucer end Y3780 CMP #$FF ;random flag?3790 BNE SAVEEY ;No. use as Y380F}0 LDA FROMX ;use X for Y3810 SAVEEY STA TOY ;to Y vector3820 JMP GETBV ;skip next3830 ;3840 ; ------------3F}850 ; Bomb handler3860 ; ------------3870 ;3880 NOSAUC LDA RANDOM ;random number3890 BMI BXMAX ;coin flip3900 F}LDA RANDOM ;random number3910 AND #1 ;make 0..13920 TAY ;use as index3930 LDA BMAXS,Y ;top/bottoF}m tbl3940 STA BOMBY,X ;bomb Y-coord3950 SETRBX LDA RANDOM ;random number3960 CMP #250 ;compare w/2503970 BF}CS SETRBX ;less than? No.3980 STA BOMBX,X ;bomb X-coord3990 JMP BOMVEC ;skip next4000 BXMAX LDA RANDOM ;random nF}umber4010 AND #1 ;make 0..14020 TAY ;use as index4030 LDA BMAXS,Y ;0 or 2504040 STA BOMBX,X F};bomb X-coord4050 SETRBY LDA RANDOM ;random number4060 CMP #250 ;compare w/2504070 BCS SETRBY ;less than? No.F}4080 STA BOMBY,X ;bomb Y-coord4090 BOMVEC LDA BOMBX,X ;bomb X-coord4100 STA FROMX ;shot from X4110 LDA BOMBYF},X ;bomb Y-coord4120 STA FROMY ;shot from Y4130 LDA #128 ;planet center4140 STA TOX ;shot to X-coordF}4150 STA TOY ;shot to Y-coord4160 GETBV JSR VECTOR ;calc shot vect4170 ;4180 ; ---------------------4190 ; Store F}vector in table4200 ; ---------------------4210 ;4220 LDA LR ;bomb L/R flag4230 STA BOMBLR,X ;bomb L/R tableF}4240 LDA UD ;bomb U/D flag4250 STA BOMBUD,X ;bomb U/D table4260 LDA VXINC ;velocity X inc4270 STA F}BXINC,X ;Vel X table4280 LDA VYINC ;velocity Y inc4290 STA BYINC,X ;Vel Y table4300 RTS ;return4310F} ;4320 ; -----------------------------4330 ; Saucer random generator 0..994340 ; -----------------------------4350 ;4360F} SAURND LDA RANDOM ;random number4370 AND #$7F ;0..1274380 CMP #100 ;compare w/1004390 BCS SAURND ;lessF} than? No.4400 RTS ;return4410 ;4420 ; --------------------4430 ; Saucer shoot routine4440 ; ---------------F}-----4450 ;4460 SSHOOT LDA RANDOM ;random number4470 CMP #6 ;2.3% chance?4480 BCS NOSS ;less than? No.44F}90 LDX #7 ;7 = index4500 LDA PROACT,X ;projectile #74510 BEQ GOTSS ;active? No.4520 DEX ;6 F}= index4530 LDA PROACT,X ;projectile #64540 BEQ GOTSS ;active? No.4550 NOSS RTS ;return, no shot4560 ;4F}570 ; --------------------4580 ; Enable a saucer shot4590 ; --------------------4600 ;4610 GOTSS LDA #48 ;PF center, YF}4620 STA TOY ;shot to Y-coord4630 LDA #80 ;PF center X4640 STA TOX ;shot to X-coord4650 LDA BOF}MBX+3 ;saucer x-coord4660 SEC ;set carry4670 SBC #44 ;PF offset4680 STA FROMX ;shot from X4690 F} STA PROJX,X ;X-coord table4700 CMP #160 ;screen X limit4710 BCS NOSS ;on screen? No.4720 LDA BOMBY+3F} ;saucer Y-coord4730 SBC #37 ;PF offset4740 LSR A ;2 scan lines4750 STA FROMY ;shot from Y4760 F} STA PROJY,X ;Y-coord table4770 CMP #95 ;screen Y limit4780 BCS NOSS ;on screen? No.4790 LDA #13 ;F}shot snd time4800 STA ESSCNT ;emeny snd count4810 JMP PROVEC ;continue4820 ;4830 ; ----------------------4840 F}; Projectile initializer4850 ; ----------------------4860 ;4870 PROINI LDX #5 ;6 projectiles4880 PSCAN LDA PROACT,X ;geF}t status4890 BEQ GOTPRO ;active? No.4900 DEX ;Yes. try again4910 BPL PSCAN ;done? No.4920 RTS F} ;return4930 ;4940 ; -----------------4950 ; Got a projectile!4960 ; -----------------4970 ;4980 GOTPRO LDA #13 F} ;shot snd time4990 STA PSSCNT ;player sht snd5000 LDA SATX ;satellite X5010 STA FROMX ;shot from X5020F} STA PROJX,X ;proj X table5030 LDA SATY ;satellite Y5040 STA FROMY ;shot from Y5050 STA PROJY,X ;projF} Y table5060 LDA CURX ;cursor X-coord5070 SEC ;set carry5080 SBC #48 ;playfld offset5090 SF}TA TOX ;shot to X-coord5100 LDA CURY ;cursor Y-coord5110 SEC ;set carry5120 SBC #32 ;playflF}d offset5130 LSR A ;2 line res5140 STA TOY ;shot to Y-coord5150 PROVEC JSR VECTOR ;compute vect5160 F} LDA VXINC ;X increment5170 STA PXINC,X ;X inc table5180 LDA VYINC ;Y increment5190 STA PYINC,X ;Y inc tabF}le5200 LDA LR ;L/R flag5210 STA PROJLR,X ;L/R flag table5220 LDA UD ;U/D flag5230 STA PROJUD,X F};U/D flag table5240 LDA #1 ;active5250 STA PROACT,X ;proj status5260 RT2 RTS ;return5270 ;5280 ; --F}------------------5290 ; Bomb advance handler5300 ; --------------------5310 ;5320 BOMADV LDA BOMTIM ;bomb timer5330 F} BNE RT2 ;time up? No.5340 LDA LIVES ;any lives?5350 BPL REGBT ;Yes. skip next5360 LDA #1 ;speed F}up bombs5370 BNE SETBTM ;skip next5380 REGBT LDA BOMTI ;get bomb speed5390 SETBTM STA BOMTIM ;reset timer5400 LDF}X #3 ;check 4 bombs5410 ADVBLP LDA BOMACT,X ;bomb on?5420 BEQ NXTBOM ;No. try next5430 JSR ADVIT ;advance F}bomb5440 LDA LIVES ;any lives left?5450 BPL SHOBOM ;Yes. skip next5460 JSR ADVIT ;No. move bombs5470 F} JSR ADVIT ;4 times faster5480 JSR ADVIT ;than normal5490 ;5500 ; --------------------------5510 ; We've now got F}updated bomb5520 ; coordinates for plotting!5530 ; --------------------------5540 ;5550 SHOBOM LDA BOMBY,X ;bomb Y-coordF}5560 CLC ;clear carry5570 ADC #2 ;bomb center off5580 STA INDX1 ;save it5590 LDA #0 ;gF}et zero5600 STA LO ;init low byte5610 TXA ;index to Acc5620 ORA # >PLR0 ;mask w/address5630 F}STA HI ;init high byte5640 STX INDX2 ;X temp hold5650 CPX #3 ;saucer slot?5660 BNE NOTSAU ;No. skF}ip next5670 LDA SAUCER ;saucer in slot?5680 BNE NXTBOM ;Yes. skip bomb5690 NOTSAU LDY BOMBLR,X ;L/R flag5700 F} LDA #17 ;do 17 bytes5710 STA TEMP ;set counter5720 LDX BPSTRT,Y ;start position5730 LDY INDX1 ;bombF} Y pos5740 BDRAW CPY #32 ;off screen top?5750 BCC NOBDRW ;Yes. skip next5760 CPY #223 ;screen bottom?5770 F} BCS NOBDRW ;Yes. skip next5780 LDA BOMPIC,X ;bomb picture5790 STA (LO),Y ;put in PM area5800 NOBDRW DEY F};PM index5810 DEX ;picture index5820 DEC TEMP ;dec count5830 BNE BDRAW ;done? No.5840 LDX INF}DX2 ;restore X5850 LDA BOMBX,X ;bomb X-coord5860 STA HPOSP0,X ;player pos5870 NXTBOM DEX ;more bombs?5880 F} BPL ADVBLP ;yes!5890 RTS ;all done!5900 ;5910 ; --------------------------5920 ; Projectile advance handF}ler5930 ; --------------------------5940 ;5950 PROADV LDX #11 ;do 8: 11..45960 PADVLP LDA BOMACT,X ;active?5970 BEQF} NXTPRO ;No. skip next5980 LDA BOMBX,X ;bomb X-coord5990 STA PLOTX ;plotter X6000 LDA BOMBY,X ;bomb Y-coordF}6010 STA PLOTY ;plotter Y6020 STX XHOLD ;X-reg temporary6030 JSR PLOT ;calc plot addr6040 LDA (LO)F},Y ;get plot byte6050 AND ERABIT,X ;erase bit6060 STA (LO),Y ;replace byte6070 LDX XHOLD ;restore X6080 F} JSR ADVIT ;advance proj6090 LDA BOMBX,X ;bomb X-coord6100 CMP #160 ;off screen?6110 BCS KILPRO ;Yes. F}kill it6120 STA PLOTX ;plotter X6130 LDA BOMBY,X ;bomb Y-coord6140 CMP #96 ;off screen?6150 BCS KILF}PRO ;Yes. kill it6160 STA PLOTY ;plotter Y6170 JSR PLOT ;calc plot addr6180 LDA PLOTBL,X ;get plot maskF}6190 AND (LO),Y ;chk collision6200 BEQ PROJOK ;No. plot it6210 LDX XHOLD ;restore X6220 LDA PLOTX ;pF}roj X-coord6230 STA NEWX ;explo X-coord6240 LDA PLOTY ;proj Y-coord6250 STA NEWY ;explo Y-coord6260 F} JSR NEWEXP ;set off explo6270 KILPRO LDA #0 ;get zero6280 STA BOMACT,X ;kill proj6290 JMP NXTPRO ;skip nextF}6300 PROJOK LDA PLOTBL,X ;plot mask6310 LDX XHOLD ;restore X6320 AND PROMSK,X ;mask color6330 ORA (LO),Y ;F}add playfield6340 STA (LO),Y ;replace byte6350 NXTPRO DEX ;next projectile6360 CPX #3 ;proj #3 yet?637F}0 BNE PADVLP ;No. continue6380 RTS ;return6390 ; ;next projectile6360 CPX #3 ;proj #3 yet?637DD